我正在阅读一本关于C#任务并行库的书,并且有以下示例,但是永远不会触发TaskScheduler.UnobservedTaskException处理程序.任何人都可以给我任何线索,为什么?
TaskScheduler.UnobservedTaskException += (object sender, UnobservedTaskExceptionEventArgs eventArgs) =>
{
eventArgs.SetObserved();
((AggregateException)eventArgs.Exception).Handle(ex =>
{
Console.WriteLine("Exception type: {0}", ex.GetType());
return true;
});
};
Task task1 = new Task(() =>
{
throw new ArgumentNullException();
});
Task task2 = new Task(() => {
throw new ArgumentOutOfRangeException();
});
task1.Start();
task2.Start();
while (!task1.IsCompleted || !task2.IsCompleted)
{
Thread.Sleep( 5000 );
}
Console.WriteLine("done");
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud) 我们在.Net 4(没有异步等待可用)应用程序中使用任务,有时它们用于启动"Fire and Forget"操作,如下所示:
private void Test()
{
Task task = Task.Factory.StartNew(() =>
{
throw new ApplicationException("Test");
});
}
Run Code Online (Sandbox Code Playgroud)
我们希望此异常在不等待任务的情况下使应用程序崩溃(否则将其置于任务中是没有意义的,至少在我们的场景中)并且不等待终结器,因为我们想要在发生意外错误时关闭应用程序避免状态损坏(我们正在保存异常发生时的状态).
我的猜测是,不知怎的,我们应该使用延续任务,但是将延续代码放在另一个不会使应用程序崩溃的任务中,所以我在这里被阻止了.
任何帮助将非常感激
编辑:如果切换到ThreadPool,结果是预期的结果.以下代码崩溃了应用程序:
ThreadPool.QueueUserWorkItem((c) =>
{
throw new ApplicationException("Test");
});
Run Code Online (Sandbox Code Playgroud)