2014-01-14 31 views
3

我有一个链接任务2使用类似这样的地方任务1初始化,并返回一个IDisposable对象的场景:如何正确处理一次性任务结果?

Task.Factory.StartNew<Stream>(() => 
{ 
    // open and write stream 
}) 
.ContinueWith(prevTask => 
{ 
    var stream = prevTask.Result; // possible AggregateException 
    // read stream and close it 
}); 

的问题是:如何正确处置的对象?一个有趣的案例可能是这样的:Task1打开+读取流,然后发生异常,在Task2中重新生成异常,因此Task2将看不到仍然打开的原始流。

有没有像using() { ... }这样的一些众所周知的模式来做到这一点?

+0

不能使用await关键字吗? – Olivier

+0

不,它是.NET4代码 – metalheart

+2

@metalheart:您仍然可以使用Microsoft.Bcl.Async程序包在.NET 4中使用async/await。您确实需要C#5编译器(VS2012或更高版本)。 –

回答

0

正如评论中提到的那样,您使用await关键字调用了您要查找的模式。 异常被重新抛出的原因是因为您正在访问prevTask.Result。如果你第一次打电话给prevTask.IsFaulted,那么你将能够做出反应而不会重新排除异常。