计时器在停止后不会启动

时间:2016-06-01 12:52:32

标签: c# wpf multithreading timer

在我的申请中,我使用了两个Timer,每个Timer使用BackgroundWorker。这里的声明:

DispatcherTimer timer1 = new DispatcherTimer(); 
DispatcherTimer timer2 = new DispatcherTimer(); 
BackgroundWorker worker1 = new BackgroundWorker();
BackgroundWorker worker2= new BackgroundWorker(); 

我使用timer1执行繁重的方法,BackgroundWorkertimer2执行另一个检查文件内容的BackgroundWorker

通过这种方式,我将事件分配给BackgroundWorkers

worker1.DoWork += worker_DoWork;
worker1.RunWorkerCompleted += worker_RunWorkerCompleted;
worker1.WorkerSupportsCancellation = true;
worker2.DoWork += worker_DoWork2;
worker2.RunWorkerCompleted += worker_RunWorkerCompleted2;
worker2.WorkerSupportsCancellation = true;

现在timer1的范围为15 minutes,因此BackgroundWorker每15分钟执行一次重法。 timer2的范围为1 secondtimer1所有工作都很好,但是当我添加timer2时,问题就会出现。

正如我之前所说的,这个计时器允许我启动一个通过worker2读取文件的方法,这个文件有一个属性,如果这个属性改变我需要执行一些特殊的活动。直到这里没问题。

我所做的是以下内容:

//This method is called by MainWindow
public ReadFile()
{
    //before this I already assigned to timer1 the tick event and start
    timer2.Tick -= new EventHandler(Event_Tick);
    timer2.Tick += new EventHandler(Event_Tick);
    timer2.Interval = new TimeSpan(0, 0, 1);
    timer2.Start();
}

这是与Tick

相关联的timer2事件
private void Event_Tick(object sender, EventArgs e)
{
     if (!worker1.IsBusy) //I skip the reading, worker1 is busy
     {
         timer1.Stop(); //stop the first timer
         worker2.RunWorkerAsync();
     }
     else
     {
         Console.WriteLine("worker1 is busy!");
     }
 }

我不需要在这里添加DoWork,只是解析文件,对于这个问题非常无用。当worker2完成任务时我就这样做了:

 private void worker_RunWorkerCompleted2(object sender, RunWorkerCompletedEventArgs e)
{
     timer1.Start();
     ReadFile();
}

如何看到我再次启动timer1,然后再次执行ReadFile方法。现在,如果timer1已达到时间间隔,那么15 minutes已经过去,则应执行执行timer1.Tick += new EventHandler(Heavy_Tick);DoWork的{​​{1}}。但是worker1永远不会开始。

我无法弄清楚,我做错了什么?

2 个答案:

答案 0 :(得分:0)

所以可能会有很多事情发生,但你应该确保:

  1. 您的计时器不会存储它的旧进度,而您在停止前检查一段时间。这将自动导致计时器在重新启动时停止。

  2. timer.stop()函数未将对象置于不可重启状态。

  3. 您没有通过一些保持停止值的指针访问计时器变量。 (当它发生时不太可能但很烦人)

  4. 我个人认为只是暂停计时器并重置进度,而不是完全停止它,因为这会导致问题。

答案 1 :(得分:0)

现在我明白了! 您希望每15分钟执行一次worker1,每秒worker2执行worker1,但仅在if (!worker1.IsBusy) //I skip the reading, worker1 is busy { timer1.Stop(); //stop the first timer worker2.RunWorkerAsync(); } 不忙时才执行public ReadFile() { //before this I already assigned to timer1 the tick event and start timer2.Tick -= new EventHandler(Event_Tick); timer2.Tick += new EventHandler(Event_Tick); timer2.Interval = new TimeSpan(0, 0, 1); timer2.Start(); } 。你的问题就在这里:

Form_Load()

和此:

Main()

在启动期间设置计时器间隔和刻度事件处理程序,例如Tick().Start()的开头。也在那里开始。你根本不应该停止任何计时器! 通过设置间隔,您所要做的就是处理Stop()事件。从您的WorkerCompletedTick方法移除{{1}}和{{1}}来电,您应该可以。