簡體   English   中英

異步等待異常捕獲 - 我在哪個線程?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM