使用TPL进行异常处理

Era*_*lel 9 c# task-parallel-library

使用TPL/Tasks我可以使用内部try/catch语句执行异常处理:

  Task.Factory.StartNew(
    ()=>
      {
        try
        {
          // Do stuff
        }
        catch
        {
          // Handle exception
        }
      });
Run Code Online (Sandbox Code Playgroud)

或使用ContinueWith,如下所示:

Task.Factory.StartNew(
    ()=>
      {
          // Do stuff
      }).ContinueWith(
        task =>
        {
          if(task.Exception != null)
            // Handle exception
        });
Run Code Online (Sandbox Code Playgroud)

更推荐使用哪种方法?每个人的缺点和优点是什么?

Ser*_*rvy 3

如果您能够正确处理任务本身抛出的方法中的异常,您应该在第一个任务中捕获它,而不是在延续中,除非您有一些令人信服的理由不这样做。在与任务本身相同的范围内创建延续(如第二个示例中所做的那样)会不必要地增加更多工作。

当异常是从与定义任务的范围完全不同的范围处理时,连续处理异常是有用的或者是必要的。例如,如果您有一个被赋予某些任意任务的方法,并且它不知道该任务的定义可能是什么,但它需要在代码抛出异常时执行某些操作,您需要处理异常的延续。

请注意,如果您使用处理异常的延续,则可以TaskContinuationOptions.OnlyOnFaulted仅在任务引发异常时运行延续,而不是在延续的定义内进行检查。