在我的申请中,我使用了两个Timer
,每个Timer
使用BackgroundWorker
。这里的声明:
DispatcherTimer timer1 = new DispatcherTimer();
DispatcherTimer timer2 = new DispatcherTimer();
BackgroundWorker worker1 = new BackgroundWorker();
BackgroundWorker worker2= new BackgroundWorker();
我使用timer1
执行繁重的方法,BackgroundWorker
和timer2
执行另一个检查文件内容的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 second
。 timer1
所有工作都很好,但是当我添加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
永远不会开始。
我无法弄清楚,我做错了什么?
答案 0 :(得分:0)
所以可能会有很多事情发生,但你应该确保:
您的计时器不会存储它的旧进度,而您在停止前检查一段时间。这将自动导致计时器在重新启动时停止。
timer.stop()函数未将对象置于不可重启状态。
您没有通过一些保持停止值的指针访问计时器变量。 (当它发生时不太可能但很烦人)
我个人认为只是暂停计时器并重置进度,而不是完全停止它,因为这会导致问题。
答案 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()
事件。从您的WorkerCompleted
和Tick
方法移除{{1}}和{{1}}来电,您应该可以。