异步等待异常捕获-我在哪个线程上
本文关键字:线程 等待 异常 异步 | 更新日期: 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
,则它不会在调用线程中抛出。