有没有办法在任务中禁用windows.form.timer?

时间:2015-05-15 00:19:40

标签: c# timer thread-safety task

有没有办法在任务中禁用windows.form.timer?

这是我的示例代码。

private void timer1_Tick(object sender, EventArgs e)
{
     Task.Factory.StartNew( () => {runTask();} );
}
private void runTask()
{
     //Process here....
     timer1.enabled = false;
     MessageBox.Show(timer1.Enabled.ToString());
}

当我运行程序时,timer1.enabled的值仍为true。 反正在任务中禁用Timer吗?

1 个答案:

答案 0 :(得分:2)

禁用计时器工作正常,您可以通过不获取屏幕消息框轻松判断。这是你的测试代码问题,它有一个线程竞争错误。睡觉也很容易看到:

    private void runTask() {
        //Process here....
        timer1.Enabled = false;
        System.Threading.Thread.Sleep(100);
        MessageBox.Show(timer1.Enabled.ToString());
    }

你现在看到“假”。您可以通过更改@ Ron的代码段并使用BeginInvoke而不是Invoke来查看完全相同的错误。

Timer类已经可以线程安全地停止,不需要任何帮助。你可以从Reference Source看到它,注意对PostMessage()的调用。但是,启动计时器并不安全,工作线程不会运行调度程序循环,因此Tick事件不会触发。

你没有问题,不要修理它。