我有一些在通过 TPL 生成的异步 Task
中运行的复杂函数,它们偶尔会以意外 方式失败。当发生此类故障时,这表明可能导致程序状态损坏的编程错误。因此,我不希望我的程序捕获异常、处理它并“跛行”,我希望我的进程崩溃并终止。
我还希望它以 Windows 错误报告系统将其检测为崩溃的方式终止,并执行所有有用的调试操作,例如捕获小型转储、将其发送给 Microsoft 等。
我知道这可能与您关于程序在错误情况下应该做什么的观点背道而驰,但问题不在于此。
我遇到的问题是,因为异常是从任务中引发的,它不会立即导致进程崩溃。一段时间后,当垃圾收集器根据其智慧决定收集“未观察到的”异常时,它会崩溃。
我希望进程立即崩溃,因为...
- 实际错误的调用堆栈和线程转储是我想在故障转储中收集的内容
- 进程“一瘸一拐”并在一段时间后崩溃可能会造成进一步的损害,因为它将在可能已损坏的程序状态下工作
- 用户对实际导致崩溃发生的操作感到困惑
所以,简而言之,问题是:
如何使我的进程从使用 TPL 创建的异步 Task
崩溃,以便 Windows 错误报告能够创建有用的小型转储?
提前致谢!
最佳答案
你可以试试这个,或者类似的东西:
public static Task FailFastOnException(this Task task)
{
task.ContinueWith(c => Environment.FailFast(“Task faulted”, c.Exception),
TaskContinuationOptions.OnlyOnFaulted |
TaskContinuationOptions.ExecuteSynchronously |
TaskContinuationOptions.DetachedFromParent);
return task;
}
然后:
var t = Task.Factory.StartNew(…).FailFastOnException();
我们刚刚在“即发即弃”任务中大量使用了它,如果它们由于某种原因失败了,我们希望取消这些任务。
摘自 Stephen Toub 撰写的博客文章: http://blogs.msdn.com/b/pfxteam/archive/2009/05/31/9674669.aspx
关于c# - 从异步任务中止当前进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13349157/