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

本文关键字:线程 等待 异常 异步 | 更新日期: 2023-09-27 18:01:55

我想这样做:

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

注意:我在线程池上运行任务,所以没有async上下文。

我想能够告诉立即抛出的异常之间的区别,我仍然在调用线程(例如parameter是无效的,导致函数中止),当异步任务完成时抛出的异常,我在其他一些随机回调线程(例如网络故障)

如果我不使用await,并且只是在异步操作上使用ContinueWith,那么我可以计算出如何实现这一点,但是可以使用await吗?

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

将任务存储在变量中:

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

然后等待:

await task; //may throw

这样就可以区分潜在异常的两个来源。

注意,async方法从不直接抛出。它们通过返回的任务传递异常。

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