jav*_*red 9 c# task-parallel-library
是否有可能在任何Task终止到期异常和日志时捕获?我已经添加了CurrentDomain_UnhandledException处理,但这没有帮助.
我Task.Factory.StartNew()像往常一样使用创建任务.当发生这样的任务异常时,它会无声地崩溃(但它应该永远工作,我也在使用LongRunning选项).所以我希望收到有关此类行为的通知.
理想情况下,我想设置一些选项,以便在任何任务崩溃到期时通知.
如果不可能那么我可能应该为我创建的每个任务添加一些内容吗?当然我可以try{} finally{}在每个任务中添加大块,但可能有更好的解决方案?
假设你有一个Testas Task来运行:
static int Test()
{
throw new Exception();
}
Run Code Online (Sandbox Code Playgroud)
第一种方法 - 在调用者的线程中处理异常:
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财产获得.
第二种方法 - 在某个任务的线程中处理异常:
定义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)参考:如何:处理任务引发的异常
对于您自己创建的任务,它相当简单:创建您自己的方法,该方法调用Task.Factory.StartNew(),但也在Task.ContinueWith(loggingDelegate, TaskContinuationOptions.OnlyOnFaulted返回任务之前调用。
问题是,这不会为基础设施其他部分创建的任务添加错误处理程序 - 包括 C# 5 中的异步方法。不过,它仍然可能对您有用。
您也可以使用TaskScheduler.UnobservedTaskException, 但根据名称,该名称只会在其他尚未观察到的异常时调用。(再说一遍,这可能对你来说没问题......)
| 归档时间: |
|
| 查看次数: |
1466 次 |
| 最近记录: |