[英]async await exception catching - which thread am I on?
我想做這樣的事情:
public async Task<int> DoWork(int parameter) {
try {
await OperationThatMayCompleteSynchronously(parameter);
} catch(Exception) e {
if(completedSynchronously)
doSyncThing();
else
doAsyncThing();
}
}
注意:我正在線程池上運行任務,因此沒有異步上下文。
我希望能夠分辨出立即拋出的異常和我仍然在調用線程上的區別(例如parameter
無效導致函數中止),並且當異步任務完成時拋出異常,並且我我在一些其他隨機回調線程(例如網絡故障)
如果我沒有使用await
,並且在異步操作中使用了ContinueWith
,我可以弄清楚如何實現這一點,但是可以使用await
嗎?
將任務存儲在變量中:
var task = OperationThatMayCompleteSynchronously(parameter); //may throw
然后等待它:
await task; //may throw
這樣,您可以區分潛在異常的兩個來源。
請注意, async
方法永遠不會直接拋出。 他們通過他們返回的任務傳遞異常。 即使對於在第一次等待之前執行的“驗證”拋出也是如此。
您可以調用Wait()
或Result
,而不是等待,因為您聲稱沒有同步上下文,並且,如果捕獲的異常是AggregateException
,則它不會在調用線程中拋出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.