我想做这样的事情:

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 方法从不直接抛出。他们通过他们返回的任务传递异常。即使对于在第一次等待之前执行的“验证”抛出也是如此。

关于c# - 异步等待异常捕获 - 我在哪个线程上?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31304614/

10-12 12:42
查看更多