使用TaskScheduler.UnobservedTaskException可以避免进程被终止
本文关键字:终止 进程 可以避免 TaskScheduler UnobservedTaskException 使用 | 更新日期: 2023-09-27 18:18:34
据我所知,如果任务中有未处理的异常,并且如果您不处理TaskScheduler。unservedtaskexception,它将在稍后收集/完成时出错,并将杀死您的进程。(我应该强调它是在.net4.0中。我知道默认情况下,我们可以在.net4.5中抑制未处理的异常。)
这意味着如果我使用TaskScheduler。unservedtaskexception,应用程序能否存活?我测试了下面的代码:
static void Main(string[] args)
{
TaskScheduler.UnobservedTaskException += (o, ev) =>
{
Console.WriteLine(ev.Exception);
Console.WriteLine("---------");
};
for (int i = 0; i < 10; i++)
{
try
{
var t = Task.Factory.StartNew<int>(() =>
{ throw new Exception("xxxxxx"); return 1; },
CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default);
}
catch
{
Console.WriteLine("error");
}
}
while (true)
{
GC.Collect();
Thread.Sleep(1000);
}
Console.ReadKey();
}
这段代码创建10个任务,每个任务抛出一个未处理的异常。并且触发一次UnobservedTaskException。那么应用程序就坏了。(我尝试只创建一个任务,在这种情况下应用程序没有损坏)
所以我的结论是,使用UnobservedTaskException事件是没有用的,进程仍然可以被杀死。我说的对吗?
您需要调用UnobservedTaskExceptionEventArgs.SetObserved
以使其成为观察到的异常:
TaskScheduler.UnobservedTaskException += (o, ev) =>
{
Console.WriteLine(ev.Exception);
Console.WriteLine("---------");
ev.SetObserved();
};