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

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

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

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

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

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

  • 简而言之,问题是:

    我如何使我的进程从使用TPL创建的async 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/

    10-17 02:41