计时器停止时调用BackgroundWorker RunWorkerCompleted事件

本文关键字:BackgroundWorker RunWorkerCompleted 事件 调用 计时器 | 更新日期: 2023-09-27 18:21:48

我有一个创建计时器的BackgroundWorker。定时器对DataTable进行重复调用。我只希望在计时器停止时调用BackgroundWorker.RunWorkerCompleted事件。我该怎么做?

谢谢。

计时器停止时调用BackgroundWorker RunWorkerCompleted事件

只需在BackgroundWorkerDoWork事件处理程序中创建一个循环,然后重复该循环,直到计时器停止。或多或少如此:

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();
    }
}
相关文章:
  • 没有找到相关文章