尝试捕获:await Task.Run(() =>
是否有意义或仅在等待中使用它们?
private async void Test()
{
try
{
await Task.Run(() =>
{
try
{
DoingSomething();
}
catch (Exception ex)
{
log.Error(ex.Message);
}
});
}
catch (Exception ex)
{
log.Error(ex.Message);
}
}
答案 0 :(得分:13)
如果您在委托中处理Exception
(在您的情况下仅用于记录目的),await
在正常情况下不会引发异常。这应该没问题。
private async Task Test()
{
await Task.Run(() =>
{
try
{
DoingSomething();
}
catch (Exception ex)
{
log.Error(ex.Message);
}
});
}
但是,由于await
Task
DoSomethingElse
很可能,Test
方法中会有一些Task
,这可能会受到try/catch
方法的影响await
- 在这种情况下,private async Task Test()
{
try
{
await Task.Run(() =>
{
try
{
DoingSomething();
}
catch (SomeSpecialException spex)
{
// it is OK to have this exception
log.Error(ex.Message);
}
});
DoSomethingElse(); // does not run when unexpected exception occurs.
}
catch (Exception ex)
{
// Here we are also running on captured SynchronizationContext
// So, can update UI to show error ....
}
}
周围{{1}}也是有意义的。
{{1}}
答案 1 :(得分:8)
如果您传递给Task.Run
的代理人引发了异常,那么当您Task.Run
返回任务时,您可以在await
之外将其捕获。
您不应该将await
视为一块。没有“在等待中”之类的东西。相反,将await
视为采用单个参数的运算符(在本例中为Task
返回的Task.Run
)。 Task.Run
将从其委托中捕获异常并将其放在返回的Task
上;然后await
将传播该异常。
答案 2 :(得分:1)
您也可以将try catch添加到外部代码中。当异步调用期间发生异常时,编译器将执行catch部分。这里有更多详细信息为什么你需要尝试catch等待http://msdn.microsoft.com/en-us/library/vstudio/0yd65esw.aspx看看异步方法中的例外