等待的任务不能优雅地处理异常

Ger*_*ard 2 c# exception async-await

我希望我可以使用这种模式:

var task = Task.Run(() => Agent.GetUserType(Instance));
await task;
string information = task.GetExceptionOrStatus(); // extension method
Run Code Online (Sandbox Code Playgroud)

当我的sql服务器没有启动时 - 就像一个测试用例 - 我看到WCF服务抛出的异常没有被任务正常处理,我得到:
Microsoft中出现了类型'System.ServiceModel.FaultException'的异常. Threading.Tasks.dll但未在用户代码中处理.
我的印象是我的代码能够从任务对象中提取错误.

我该怎么做得更好?

Ste*_*ary 6

await 将按设计传播该任务的任何例外情况.

var task = Task.Run(() => Agent.GetUserType(Instance));
try
{
  await task;
}
catch (Exception ex)
{
  // TODO
}
string information = task.GetExceptionOrStatus(); // extension method
Run Code Online (Sandbox Code Playgroud)

  • @Gerard:`ThrowUnobservedTaskExceptions`与此行为无关.传播异常是`async`的设计方式; 有什么理由你*不想*? (2认同)
  • @Gerard:我建议你不要那样查看`Task`类型.相反,只需将其视为同步操作的异步等效项.你可以使用@ svick的`IgnoreException`这样的东西,但我不推荐它; 它是"On Error Resume Next"的异步等价物,或者用`catch`包装`try`中的每个语句.这不是你应该一直使用的东西.`NotifyTaskCompletion`是一个不寻常的案例; 它故意捕获错误并且*不*传播它们,因为它假定您将通过数据绑定处理它们. (2认同)