是否存在类似Thread.OnAborting()的事件?

时间:2011-07-20 13:48:36

标签: c# multithreading exception

环境:

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

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

我有两个计时器:

  • timer1刻度线上,应用程序正在检索新请求并将其存储在Queue
  • timer2刻度线上,应用程序将使用新Thread执行任务的请求出列。

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

问题:

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

问题:

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

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

3 个答案:

答案 0 :(得分:5)

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

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

  • 民意调查
  • 使用等待句柄
  • 致电Thread.Interrupt
  • 使用长期运行的API中内置的取消机制

您可以查看我的回答here以获取更多信息。

答案 1 :(得分:1)

答案 2 :(得分:1)

Leito,它可能是通过简单地设置标志或发出事件或信号来设计可中断任务的最佳方式。遗憾的是,您为我提供了更少的详细信息,为您提供了一个确切的代码段,但可能的,非常基本的解决方案可能是:

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;
    }
}

请注意,此代码段非常基本,可能需要修改才能满足您的需求。我希望它能帮助你理解正确的多线程。

请不要使用Thread.Abort()。它只会给你带来很多麻烦。