【发布时间】:2018-04-18 04:01:37
【问题描述】:
据我所知,如果任务中有未处理的异常,并且如果您不处理 TaskScheduler.UnobservedTaskException,那么稍后它会在收集/完成时出错,并且会杀死您的进程。(我应该强调一点它在 .net4.0 中。我知道我们可以默认抑制 .net4.5 中未处理的异常。)
这意味着如果我使用TaskScheduler.UnobservedTaskException,应用程序可以存活吗?我测试了以下代码:
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 事件没有用,进程仍然可以被杀死。我说的对吗?
【问题讨论】:
标签: c# multithreading exception asynchronous task-parallel-library