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

Ori*_*rds 7 c# exception-handling async-await

我想做这样的事情:

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

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

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

如果我不使用await,我可以弄清楚如何实现这一点,并且只是ContinueWith在异步操作中使用,但它是否可以使用await

usr*_*usr 10

将任务存储在变量中:

var task = OperationThatMayCompleteSynchronously(parameter); //may throw
Run Code Online (Sandbox Code Playgroud)

然后等待它:

await task; //may throw
Run Code Online (Sandbox Code Playgroud)

这样,您可以区分潜在异常的两个来源.

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

  • 哦,当你指出它时,这么简单 (2认同)