异步等待异常捕获 - 我在哪个线程?

时间:2015-07-08 22:00:45

标签: c# exception-handling async-await

我想做这样的事情:

public async Task<int> DoWork(int parameter) {
    try {
        await OperationThatMayCompleteSynchronously(parameter);
    } catch(Exception) e { 
        if(completedSynchronously)
           doSyncThing();
        else
           doAsyncThing();
    }
}

注意:我正在线程池上运行任务,因此没有异步上下文。

我希望能够分辨出立即抛出的异常与我仍在调用线程之间的区别(例如parameter无效导致函数中止),并且抛出异常时抛出异常异步任务完成,我在其他一些随机回调线程(例如网络故障)

如果我没有使用await,并且在异步操作中使用ContinueWith,我可以解决如何实现这一点,但是可以使用await吗?

2 个答案:

答案 0 :(得分:10)

将任务存储在变量中:

var task = OperationThatMayCompleteSynchronously(parameter); //may throw

等待它:

await task; //may throw

通过这种方式,您可以区分潜在异常的两个来源。

注意,async方法永远不会直接抛出。他们通过他们返回的任务传递异常。即使在第一次等待之前执行的“验证”抛出也是如此。

答案 1 :(得分:1)

您可以调用Wait()Result,而不是等待,因为您声称没有同步上下文,并且,如果捕获的异常是AggregateException,则不会抛出调用线程。