我想做这样的事情:
public async Task<int> DoWork(int parameter) {
try {
await OperationThatMayCompleteSynchronously(parameter);
} catch(Exception) e {
if(completedSynchronously)
doSyncThing();
else
doAsyncThing();
}
}
注意:我正在线程池上运行任务,因此没有异步上下文。
我希望能够分辨出立即抛出的异常与我仍在调用线程之间的区别(例如parameter
无效导致函数中止),并且抛出异常时抛出异常异步任务完成,我在其他一些随机回调线程(例如网络故障)
如果我没有使用await
,并且在异步操作中使用ContinueWith
,我可以解决如何实现这一点,但是可以使用await
吗?
答案 0 :(得分:10)
将任务存储在变量中:
var task = OperationThatMayCompleteSynchronously(parameter); //may throw
等待它:
await task; //may throw
通过这种方式,您可以区分潜在异常的两个来源。
注意,async
方法永远不会直接抛出。他们通过他们返回的任务传递异常。即使在第一次等待之前执行的“验证”抛出也是如此。
答案 1 :(得分:1)
您可以调用Wait()
或Result
,而不是等待,因为您声称没有同步上下文,并且,如果捕获的异常是AggregateException
,则不会抛出调用线程。