2014-01-14 32 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,那麼你將能夠做出反應而不會重新排除異常。