【问题标题】:Does System.Timers.Timer terminates on aborting its working Thread?System.Timers.Timer 是否在中止其工作线程时终止?
【发布时间】:2014-04-04 16:24:25
【问题描述】:

我有这些代码在 Thread 调用的方法上使用 System.Timers.Timer

private void timeWorker()
{
     var timer = new Timer(1000);
     timer.Enabled = true;
     timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
}
public MyConstructor()
{
    var thread=new Thread(timeWorker);
    thread.IsBackground = true;
    thread.Start();
    //
    thread.Abort();
}

System.Timers.Timer 是否在终止其工作线程时终止?

【问题讨论】:

  • 1) 定时器并不真正“属于”创建它们的线程。两者之间没有任何关系。 2) 无论您在做什么,Thread.Abort 几乎肯定 不是 正确答案。但是你没有告诉我们你在这里试图解决什么问题
  • @Damien_The_Unbeliever 我的问题是我想通过中止线程来确保不再启用计时器。
  • 但中止线程本身几乎总是错误。为什么您认为解决问题的最佳方法是中止线程?
  • @Damien_The_Unbeliever 那么你的建议是什么? (我对线程不太熟悉)。
  • 如果您只想创建一个计时器,然后稍后停止该计时器的运行,只需创建Timer 对象并将其存储在您的类的字段中。然后,稍后当您想要停止它时,将其Enabled 属性设置为false。我完全不明白您为什么要创建 Thread - Timer 对象当然不需要您创建。

标签: c# .net multithreading timer


【解决方案1】:
  1. 您不能通过中止线程来终止计时器。
  2. Timer 有自己的线程来调用您的事件处理程序。
  3. 另外,正如@Damien_The_Unbeliever 所说,计时器不属于任何线程,它是系统对象。
  4. GC 不会因为您的事件处理程序而收集计时器。

你应该在你的线程方法实现中使用 try-catch 来捕获ThreadAbortException 并停止计时器。

【讨论】:

    【解决方案2】:

    MSDN C# Threading

    我建议使用此链接进行一般线程处理。还提到Abort会中断线程,防止清理使用的资源。

    更好的选择是调用一个方法来禁用 timeWorker 类中的 while 循环,例如

    public void RequestStop()
    {
        running = false;
    }
    

    当工人在循环中做他的工作时

    public void DoWork()
    {
        while(running)
        {
            ...
        }
    //execution stopped
    }
    

    带有变量private volatile bool running

    【讨论】:

      猜你喜欢
      • 2012-04-29
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 2014-02-02
      相关资源
      最近更新 更多