是否可以捕获任何任务终止到期异常和日志?

jav*_*red 9 c# task-parallel-library

是否有可能在任何Task终止到期异常和日志时捕获?我已经添加了CurrentDomain_UnhandledException处理,但这没有帮助.

Task.Factory.StartNew()像往常一样使用创建任务.当发生这样的任务异常时,它会无声地崩溃(但它应该永远工作,我也在使用LongRunning选项).所以我希望收到有关此类行为的通知.

理想情况下,我想设置一些选项,以便在任何任务崩溃到期时通知.

如果不可能那么我可能应该为我创建的每个任务添加一些内容吗?当然我可以try{} finally{}在每个任务中添加大块,但可能有更好的解决方案?

Fur*_*dar 6

假设你有一个Testas Task来运行:

static int Test()
{
    throw new Exception();
}
Run Code Online (Sandbox Code Playgroud)
  1. 第一种方法 - 在调用者的线程中处理异常:

    Task<int> task = new Task<int>(Test);
    task.Start();
    
    try
    {
        task.Wait();
    }
    catch (AggregateException ex)
    {
        Console.WriteLine(ex);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    注意:异常的类型为AggregateException.所有实际例外都可通过ex.InnerExceptions财产获得.

  2. 第二种方法 - 在某个任务的线程中处理异常:

    定义ExceptionHandler这种方式:

    static void ExceptionHandler(Task<int> task)
    {
        var ex = task.Exception;
        Console.WriteLine(ex);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    用法:

    Task<int> task = new Task<int>(Test);
    task.ContinueWith(ExceptionHandler, TaskContinuationOptions.OnlyOnFaulted);
    task.Start();
    
    Run Code Online (Sandbox Code Playgroud)

参考:如何:处理任务引发的异常


Jon*_*eet 2

对于您自己创建的任务,它相当简单:创建您自己的方法,该方法调用Task.Factory.StartNew(),但也在Task.ContinueWith(loggingDelegate, TaskContinuationOptions.OnlyOnFaulted返回任务之前调用。

问题是,这不会为基础设施其他部分创建的任务添加错误处理程序 - 包括 C# 5 中的异步方法。不过,它仍然可能对您有用。

您也可以使用TaskScheduler.UnobservedTaskException, 但根据名称,该名称只会在其他尚未观察到的异常时调用。(再说一遍,这可能对你来说没问题......)