在Task.ContinueWith之后,计时器不再启用

时间:2015-04-16 08:31:48

标签: .net timer task-parallel-library

我有一个工作时间,每1分钟检查一下是否有事可做。 如果有事情要做,计时器停止,尝试开始(startTimer),大部分需要几分钟,然后计时器应该重新开始...

但它没有用......

    private void JobTimer_Tick(object sender, EventArgs e)
    {
        WriteLog("-------------------------------------------");
        WriteLog("-----------------Jobtimer Tick-------------");
        WriteLog("-------------------------------------------");
        JobTimer.Enabled = false;
        Task.Factory.StartNew(() => StartWorker()).ContinueWith((a) => JobTimer_AfterTick(JobTimer));
    }

    private void JobTimer_AfterTick(System.Windows.Forms.Timer t)
    {
        t.Enabled = true;
    }

这样可行,但是定时器会在1分钟后再次打勾并且这不好,因为最后一次打勾甚至没有完成......

    private void JobTimer_Tick(object sender, EventArgs e)
    {
        WriteLog("-------------------------------------------");
        WriteLog("-----------------Jobtimer Tick-------------");
        WriteLog("-------------------------------------------");
        JobTimer.Enabled = false;
        Task.Factory.StartNew(() => StartWorker());;
       JobTimer.Enabled = true;
    }

1 个答案:

答案 0 :(得分:1)

System.Windows.Forms.Timer在UI线程上运行,因此您需要将延续任务与UI线程同步

Task.Factory.StartNew(() => StartWorker()).ContinueWith((a) => JobTimer_AfterTick(JobTimer), TaskScheduler.FromCurrentSynchronizationContext());