使用Task.Factory.FromAsync()中的任务未捕获异常

时间:2014-04-17 23:05:07

标签: asp.net

我创建的任务如下。

var task = Task.Factory.FromAsync<Request, Response>(
                service.BeginOp,
                service.EndOp,
                request,
                null);

当我在try / catch中等待任务时,不会捕获异常。

try
{
    await task;
}
catch (Exception e)
{
    // Block never reached
}

但是当我使用ContinueWith()时,会捕获异常。

await task.ContinueWith(t =>
{
    if (t.Exception != null)
    {
        // Block reached
    }
});

为什么第一种情况没有发现?我已经尝试/捕获了其他任务,它捕获了异常。

2 个答案:

答案 0 :(得分:0)

我怀疑您的调用堆栈越来越长,您的代码正在调用Task<T>.ResultTask.Wait。这将cause a deadlock,正如我在博客上解释的那样。

默认情况下,await会捕获&#34;上下文&#34;每当等待Task时。在这种情况下,&#34; context&#34;是ASP.NET请求上下文,它一次只允许一个线程。如果您的代码在该请求上下文中阻塞了一个线程(例如,通过调用Result / Wait),那么当任务完成时,它无法继续执行async方法,因为上下文只允许一个线程。

答案 1 :(得分:0)

原来在上面的callstack中我没有使用await。我不确定为什么编译器允许这样做。添加await修复了问题。