c# - 无需等待的任务异常处理

标签 c# exception-handling task

使用 Tasks 时,如果我没有在我的任务上调用 Wait,我不确定如何处理。以下示例未在异步方法中执行。

这是一个例子:

var t = Task.Run(() =>
{
  // do something as part of the task concurrently
});

包裹上面的整个 block 并捕获异常是正确的方法吗?

我知道我可以像下面这样等待任务结果并处理异常,但我的问题与上面的 block 有关,而无需调用 t.Wait。

try
{
  t.Wait();  
}
catch(AggregateException ae)
{
  // handle exception(s)
}

所以,我的问题是当我不等待(或等待)任务时,这是否是处理异常的正确方法?

try
{
  var t = Task.Run(() =>
  {
    // do something as part of the task concurrently
  });
}
catch(Exception ex) //NOTE general Exception
{
  // show exception in message box or log it somewhere
}

更新1 ,或者我应该这样做吗?

  var t = Task.Run(
      () => 
      {
        try
        {
          // do something as part of the task concurrently
        }
        catch(Exception ex) //NOTE general Exception
        {
          // show exception in message box or log it somewhere
        }
       });

最佳答案

您提供的代码(在编辑之后)不会帮助您处理您的任务中抛出的错误。它只会捕获主代码块中抛出的异常,例如在调度任务或获取要传递给它的参数时。

Async/Await 简化异步任务控制流程

如果您使用的是 C# 5 及更高版本(与 VS2013 捆绑在一起),最简单的方法是使用 async/await,它可以简化异步任务的控制流:

public async Task DoSomething()
{
    try
    {
        DoSyncWork();
        await Task.Run(() => AsyncStuff());
    }
    catch (Exception ex)
    {  
        // handle.
    }
}

编译器将自动解构异步任务并将异常返回到正常的 catch block - 无论代码的同步部分还是异步部分是否抛出异常。

OnlyOnFaulted 继续处理任务异常

如果您不使用 C# 5,或者不想使用 async/await(因为您处理的是并行性,而不仅仅是异步),技术是使用 Task.ContinueWith 来指定错误情况下的继续:

var task = Task.Run(() => Whatever())
               .ContinueWith(failedTask => HandleError(failedTask), 
                             TaskContinuationOptions.OnlyOnFaulted);

这将导致继续在原始任务完成后启动,但前提是它抛出异常。您可以使用它根据结果指定多个延续分支:

var baseTask = Task.Run(() => Whatever());            
baseTask.ContinueWith(failedTask => HandleError(failedTask), 
                             TaskContinuationOptions.OnlyOnFaulted);
baseTask.ContinueWith(successfulTask => HandleResults(successfulTask), 
                             TaskContinuationOptions.OnlyOnRanToCompletion);

关于c# - 无需等待的任务异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38210880/

相关文章:

c# - Hook JavaScript 中的所有函数调用?

excel - 任务完成excel函数

android - 无法从其他任务运行gradle任务

c# - Unity - 游戏对象在击中预制件时不会被破坏

获取xml元素的c#代码

c# - 使用 Lambda 从 Expression 获取集合的值 - .Contains

algorithm - 根据技能向 worker 公平分配任务的算法

c# - 相对于服务器的 URL

python - 将错误异常保存到文件错误中

python-3.x - 在Python中处理COMError?