.net 如何正确处理一次性任务结果?
我有一个场景,Task1初始化并返回一个.net 如何正确处理一次性任务结果?,.net,task-parallel-library,.net,Task Parallel Library,我有一个场景,Task1初始化并返回一个IDisposable对象,以便在链式Task2中使用,如下所示: Task.Factory.StartNew<Stream>(() => { // open and write stream }) .ContinueWith(prevTask => { var stream = prevTask.Result; // possible AggregateException // read stream
IDisposable
对象,以便在链式Task2中使用,如下所示:
Task.Factory.StartNew<Stream>(() =>
{
// open and write stream
})
.ContinueWith(prevTask =>
{
var stream = prevTask.Result; // possible AggregateException
// read stream and close it
});
Task.Factory.StartNew(()=>
{
//打开并写入流
})
.ContinueWith(prevTask=>
{
var stream=prevTask.Result;//可能的聚合异常
//读取流并关闭它
});
问题是:如何正确处理对象?一个有趣的例子可能是这样的:Task1打开并读取流,然后发生异常,该异常在Task2中重新启动,因此Task2将看不到仍然打开的原始流
是否有一些众所周知的模式,如
使用(){…}
来执行此操作?如注释中所述,您正在寻找的模式是使用wait
关键字调用的。
重新关闭异常的原因是您正在访问
prevTask.Result
。如果您第一次调用prevTask.IsFaulted
,那么您将能够做出反应,而不会重新调用异常。您不能使用wait关键字吗?不,它是.NET4code@metalheart:您仍然可以使用Microsoft.Bcl.async包在.NET 4中使用async/await。不过,您确实需要一个C#5编译器(VS2012或更高版本)。“Task1打开并读取流,然后发生异常”-Task1需要注意适当地处理流,直到它完全完成使用,并且不再抛出任何异常为止。只有在这一点上,才应该设置一个标志,使其知道不再处理它。您确实需要两个单独的任务s吗?难道不能将所有代码都放在StartNew()
lambda中吗?