C#WinForms:从线程激活计时器

时间:2011-08-10 13:01:05

标签: c# winforms

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
}

正如您所见,我希望线程激活计时器。但计时器不会激活。我想这不是正确的方法。或者我错过了一些东西。

6 个答案:

答案 0 :(得分:1)

您的帖子没有等待is_mouse_down事件。它只是在半秒后检查,如果不是时间将不会启用并且胎面关闭。也许你应该尝试使用一个活动?

答案 1 :(得分:1)

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

然而,您还有另一个更大的问题需要担心。问题是你无法触及工作线程或UI线程以外的任何其他UI元素。这包括System.Windows.Forms.Timer。随之而来的是各种不确定的混乱。您的应用程序可能无法预测且非常惊人。

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

答案 2 :(得分:0)

您可以使用AutoResetEvent从Button Click处理程序自动触发它。

所以在线程中设置:

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

并在按钮点击处理程序中:

autoResetEvent.Set();

BTW,为什么你不能在Click处理程序中初始化一个Timer?

答案 3 :(得分:0)

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

1)积极等待

2)通知

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

如果您想要通知,请在鼠标按下事件处理程序中调用一些启动计时器的方法

答案 4 :(得分:0)

如果您对c#multithreading有疑问,请阅读this文章。它真的很有用,它会向你展示AutoresetEvent,ManualResetEvents,Thread Timers,Timers等。非常好的一般文章。

答案 5 :(得分:0)

当你声明你的计时器对象时,你必须传递timer1_Tick回调。