相关疑难解决方法(0)

永远不会触发TaskScheduler.UnobservedTaskException事件处理程序

我正在阅读一本关于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)

c# task-parallel-library

34
推荐指数
2
解决办法
1万
查看次数

如何在任务抛出异常而不等待终结器时使应用程序崩溃

我们在.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)

.net c# exception task task-parallel-library

6
推荐指数
1
解决办法
1691
查看次数

标签 统计

c# ×2

task-parallel-library ×2

.net ×1

exception ×1

task ×1