我遇到了在任务中抛出未处理异常的问题。 这些异常只会被忽略,并且永远不会在任何地方传播。
代码示例:
Task<bool> Execute()
{
TaskCompletionSource<bool> tcsrc = new TaskCompletionSource<bool>();
Task.Delay(50).ContinueWith((t) => {
tcsrc.SetResult(true);
});
return tcsrc.Task;
}
async Task<bool> Test()
{
bool result = await Execute();
throw new Exception("test");
return result;
}
在此示例中,Test()等待Execute()返回的任务,然后抛出异常。 这个异常永远不会在任何地方处理,我能够捕获它的唯一地方是Application的FirstChanceException处理程序。执行此处理程序后,异常将被忽略。
Test()本身是通过来自某个UI事件处理程序的异步调用链调用的。 所以我认为它应该传播到那个UI事件处理程序并抛出。但它永远不会发生。
有什么我错过的吗?
编辑:根据FirstChanceException处理程序,在使用以下堆栈跟踪忽略之前,异常会重现三次:
at Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
答案 0 :(得分:2)
从Task<bool>
方法返回的Test
将出现故障。如果您等待该任务(或在其上调用Wait()
),那么将在该点重新抛出该异常。如果您选择忽略任务的故障状态,那么是的,您将忽略该异常。