计时器停止时调用BackgroundWorker RunWorkerCompleted事件
本文关键字:BackgroundWorker RunWorkerCompleted 事件 调用 计时器 | 更新日期: 2023-09-27 18:21:48
我有一个创建计时器的BackgroundWorker
。定时器对DataTable
进行重复调用。我只希望在计时器停止时调用BackgroundWorker.RunWorkerCompleted
事件。我该怎么做?
谢谢。
只需在BackgroundWorker
的DoWork
事件处理程序中创建一个循环,然后重复该循环,直到计时器停止。或多或少如此:
var worker = new BackgroundWorker();
worker.DoWork += (sender, e) =>
{
var timer = new Timer();
timer.Elapsed += (s, _e) =>
{
// call the database
};
timer.Start();
while (timer.Enabled)
{
// at some point: timer.Stop();
}
// if we are here, timer is no longer Enabled
// RunWorkerCompleted event will be fired next
};
(显然,我已委托设置计时器的Interval
等)
BackGroundWorker.RunWorkerCompleted在DoWork事件完成后调用。因此,如果您确保DoWork事件完成,那么后台工作者应该调用RunWorkerCompleted事件。
另一种解决方案是在后台工作程序之外创建计时器,并通过计时器控制后台工作程序实例。在计时器事件中,检查IsBusy属性是否设置为false并启动后台工作程序,或者如果IsBusy为true则跳过。
样品:
_worker.DoWork += (sender, e) =>
{
BackgroundWorker worker = sender as BackgroundWorker;
// Do your database stuff
e.Result = databaseResult;
}
_timer.Elapsed += (source, e) =>
{
if(!_worker.IsBusy)
{
_worker.RunWorkerAsync();
}
}