异步等待异常捕获——我在哪个线程上?
async await exception catching - which thread am I on?
我想做这样的事情:
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
方法从不直接抛出。他们通过 return 的任务传递异常。即使对于在第一个 await 之前执行的 "validation" 抛出也是如此。
您可以调用 Wait()
或 Result
而不是等待,因为您声称没有同步上下文,并且如果捕获的异常是 AggregateException
,则不会抛出它在调用线程中。
我想做这样的事情:
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
方法从不直接抛出。他们通过 return 的任务传递异常。即使对于在第一个 await 之前执行的 "validation" 抛出也是如此。
您可以调用 Wait()
或 Result
而不是等待,因为您声称没有同步上下文,并且如果捕获的异常是 AggregateException
,则不会抛出它在调用线程中。