【问题标题】:Does some event like Thread.OnAborting() exist?是否存在诸如 Thread.OnAborting() 之类的事件?
【发布时间】:2011-07-20 13:48:35
【问题描述】:

环境:

假设我有一个主应用程序:

  • 监听任务请求,
  • 一个接一个地执行这些任务(使用某些资源(在物理意义上)),
  • 必须能够立即停止待处理的任务以释放资源。

我有两个计时器:

  • timer1 标记上,应用程序正在检索新请求并将它们存储在Queue 中,
  • timer2 滴答声中,应用程序将请求出列以在新的Thread 中执行任务。

当用户要求停止所有任务以释放资源时,我打算简单地用Thread.Abort() 终止运行当前任务的线程。

问题:

我希望在从线程类中杀死线程时能够保存一些最后的配置。

问题:

有没有办法检测线程何时被杀死,比如Thread.OnAborting() 事件?

或者也许我可以在调用Thread.Abort() 方法时捕获ThreadAbortException 引发的问题? (如果是这样,我真的不知道该怎么做,你能提供一些代码示例吗?)

【问题讨论】:

    标签: c# multithreading exception


    【解决方案1】:

    除了捕获ThreadAbortException 之外,不存在其他机制。当然,您真的不想调用Thread.Abort,因为ThreadAbortException 是异步注入的,并且这些注入点可能是不可预测的。例如,它可能处于写入过程中,这可能会使整个 AppDomain 处于损坏状态。 .NET 2.0 添加了constrained execution regions,这使得处理线程中止更安全、更容易处理,但编写一个可以保证 AppDomain 不会损坏的代码块仍然难以置信 .我的建议是坚持Thread.Abort 的想法。

    相反,您想要做的是向线程发送信号并允许它自行优雅地终止。这可以通过以下机制完成。

    • 投票标记
    • 使用等待句柄
    • 致电Thread.Interrupt
    • 使用内置在长时间运行操作的 API 中的取消机制

    您可以查看我的回答here了解更多信息。

    【讨论】:

    • 我选择这个答案作为答案,因为它提供了几种处理Thread 结尾的方法。我将采用“投票标志”解决方案。不过,Emiswelt(提供 sn-p)和 Chris Shouts 的解决方案值得一看。
    【解决方案2】:
    【解决方案3】:

    Leito,这可能是设计可中断任务的最佳方式,只需设置一个标志或发出一个事件或信号。遗憾的是,您为我提供的详细信息较少,以便为您提供准确的代码 sn-p,但一个可能的、非常基本的解决方案可能是:

    class MyTask
    {
        bool bShouldDoWork;
    
        public event EventHandler Aborted;
    
        public void DoWork()
        {    
             bShouldDoWork = true;          
    
             while(bShouldDoWork)
             {
                  //Do work.
                  //But ensure that the loop condition is checked often enough to
                  //allow a quick and graceful termination. 
             }
    
             if(Aborted != null)
             {
                  //Fire event
                  Aborted(this, EventArgs.Empty);
             }
        }
    
        //Call this method from another thread, for example
        //when a button is pressed in your UI etc.
        public void Abort()
        {
             bShouldDoWork = false;
        }
    }
    

    请注意,此 sn-p 非常基本,可能需要修改以满足您的需要。我希望它可以帮助您理解正确的多线程。

    请不要使用 Thread.Abort()。它只会让你很头疼。

    【讨论】:

    • 注意不要使用Thread.Abort ;)。我想我会带一个布尔标志,在我看来,最适合我的解决方案的解决方案。您的代码 sn-p 是一个好的开始,谢谢。我只是想问一下 Aborted 事件有什么用?
    • 您有点要求它(“Thread.OnAborting() 事件”),但如果您不需要它,只需将其删除。希望它对你有帮助。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 2020-10-12
    • 1970-01-01
    • 2017-12-29
    • 2018-01-09
    • 2011-05-28
    • 2011-01-22
    相关资源
    最近更新 更多