2016-04-15 61 views
1

我看到Stephen Cleary的博客關於Startnew being dangerous以及如何continuewith is also dangerous。我想在這裏使用它,以避免在最後只是在例外情況下致電NSubstitute而不得不寫一個嘗試。我發現測試通過時,它應該沒有,然後注意到,異常被拋出,但它沒有超出測試信號nunit。ContinueWith不處理異步回調?

ContinueWith與Task.Startnew的行爲類似於異步函數嗎?我注意到了這個簡化等效不會拋出內部異常的NUnit的3

[Test] 
public async Task SimpleTest() 
{ 
    await Task.Delay(10).ContinueWith(async t => 
    { 
     await Task.Run(()=>{throw new Exception();}); 
    }); 
} 

回答

3

ContinueWith不明白async lambda表達式。除了傳遞任務調度程序外,您還需要使用Unwrap

我想在這裏使用它來避免必須寫一個嘗試最後只是在例外的情況下撥打NSubstitute。

我不明白這個要求。爲什麼不能這樣工作?

await Task.Delay(10); 
await Task.Run(() => { throw new Exception(); }); 
+0

在這個例子中,延遲只是一些「工作」。在我的實際測試中,工作可能會拋出一個異常,所以我將不得不先用一個try catch來包裝,然後調用NSubstitute(在一個承諾任務函數中,需要等待使用,這由task.run表示我的例子)。這看起來似乎是更多的代碼,然後使用continuewith。 – ProdigousRanger

+0

要重申,對ContinueWith的* proper *調用看起來像這樣:await Task.Delay(10).ContinueWith(_ => Task.Run(...),CancellationToken.None,TaskContinuationOptions.DenyChildAttach | TaskContinuationOptions .ExecuteSynchronously,TaskScheduler.Default).Unwrap();''我想'嘗試{await Task.Delay(10); }最後{等待Task.Run(...); ''更清潔。 –

+0

如果是這種情況(我完全無法完全正確地繼續使用),我同意。我最終創建了一個使用await和try/catch/finally的小型幫助程序庫,它類似於javascript promise,它使我能夠像doThis.finally(somethingelse)這樣的東西。這樣我就避免了繼續,並最終避免在我的測試中寫作。謝謝你的幫助Stephen。 – ProdigousRanger