我创建的任务如下。
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
}
});
为什么第一种情况没有发现?我已经尝试/捕获了其他任务,它捕获了异常。
答案 0 :(得分:0)
我怀疑您的调用堆栈越来越长,您的代码正在调用Task<T>.Result
或Task.Wait
。这将cause a deadlock,正如我在博客上解释的那样。
默认情况下,await
会捕获&#34;上下文&#34;每当等待Task
时。在这种情况下,&#34; context&#34;是ASP.NET请求上下文,它一次只允许一个线程。如果您的代码在该请求上下文中阻塞了一个线程(例如,通过调用Result
/ Wait
),那么当任务完成时,它无法继续执行async
方法,因为上下文只允许一个线程。
答案 1 :(得分:0)
原来在上面的callstack中我没有使用await。我不确定为什么编译器允许这样做。添加await修复了问题。