c# WinForms:从线程中激活计时器

本文关键字:激活 计时器 线程 WinForms | 更新日期: 2023-09-27 18:05:11

public void timer_thing()
{
    Thread timer = new Thread(new ThreadStart(() =>
      {
          Thread.Sleep(500);
          if (is_mouse_down)
              timer1.Enabled = true;
      }
    ));
    timer.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
    //some stuff happens here
}

正如你所看到的,我希望线程激活定时器。但是计时器没有启动。我想这不是正确的方式。或者我错过了什么

c# WinForms:从线程中激活计时器

当线程到达该指令时,is_mouse_down可能是false。线程不会神奇地等待它转true

然而,你还有另一个更大的问题要担心。问题是,你不能触及工作线程中的任何UI元素,也不能触及UI线程以外的任何UI元素。这包括System.Windows.Forms.Timer。各种不确定的混乱可能随之而来。您的应用程序可能会不可预知地、引人注目地失败。

我不太清楚为什么首先需要一个线程。您可以不处理Control.MouseDown事件并在该事件的事件处理程序中启用计时器吗?这就是我解决这个问题的方法。

您的线程没有等待is_mouse_down事件。它只在半秒后检查,如果不是,时间将不会启用,胎面关闭。也许你应该试试用事件?

你可以使用AutoResetEvent从按钮点击处理程序自动触发它。

在线程中设置:

autoResetEvent.WaitOne();
timer1.Enabled = true; 

和在按钮中单击处理程序:

autoResetEvent.Set();

BTW,为什么你不能初始化定时器在点击处理程序?

文献中描述的这个问题有两种解决方案:

1)主动等待

2)通知

如果你想要主动等待解决方案(这是一个过时的解决方案,你的线程应该有while循环)。

如果你想要通知当你应该调用一些方法启动定时器在鼠标下降事件处理程序

如果您对c#多线程有疑问,您应该阅读这篇文章。它真的很有帮助,将向您展示AutoresetEvent, ManualResetEvents,线程计时器,计时器等。很好的综合文章。

在声明计时器对象时必须传递timer1_Tick回调。