Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何正确处理一次性任务结果?_.net_Task Parallel Library - Fatal编程技术网

.net 如何正确处理一次性任务结果?

.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

我有一个场景,Task1初始化并返回一个
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中吗?