从异步任务中止当前进程

Mar*_*ark 5 .net c# task-parallel-library windows-error-reporting

我有一些复杂的功能,这些功能在Task通过TPL生成的异步程序中运行,有时可能会以意外的方式失败。当发生此类故障时,这表示可能导致程序状态损坏的编程错误。因此,我不希望我的程序捕获异常,对其进行处理并“套用”,我希望我的进程崩溃并终止。

我还希望事情以Windows错误报告系统将其检测为崩溃的方式消亡,并进行所有有用的调试,例如捕获小型转储,将其发送给Microsoft等。

我知道这可能与您对程序在错误情况下应执行的操作的看法背道而驰,但问题不在于此。

我的问题是,由于任务引发异常,因此不会立即导致进程崩溃。一段时间后,当垃圾收集器明智地决定收集“未观察到”的异常时,它崩溃了。

我希望该过程立即崩溃,因为...

  • 实际错误中的调用堆栈和线程转储是我要在故障转储中收集的内容
  • 该进程“继续运行”并在不确定的时间后崩溃可能会导致进一步的损坏,因为它将在可能损坏的程序状态下工作
  • 用户对实际导致崩溃的操作感到困惑

简而言之,问题是:

如何使我的进程从Task使用TPL创建的async崩溃,从而Windows错误报告能够创建有用的小型转储?

提前致谢!

Mar*_*kus 4

你可以尝试这个,或者类似的东西:

\n\n
public static Task FailFastOnException(this Task task) \n{ \n    task.ContinueWith(c => Environment.FailFast(\xe2\x80\x9cTask faulted\xe2\x80\x9d, c.Exception), \n        TaskContinuationOptions.OnlyOnFaulted | \n        TaskContinuationOptions.ExecuteSynchronously | \n        TaskContinuationOptions.DetachedFromParent); \n    return task; \n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

进而:

\n\n
var t = Task.Factory.StartNew(\xe2\x80\xa6).FailFastOnException();\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们刚刚在“即发即忘”任务中经常使用它,如果这些任务由于某种原因失败,我们希望取消该流程。

\n\n

摘自 Stephen Toub 撰写的博客文章:\n http://blogs.msdn.com/b/pfxteam/archive/2009/05/31/9674669.aspx

\n