Вызвать событие BackgroundWorker RunWorkerCompleted, когда таймер останавливается - PullRequest
0 голосов
/ 30 января 2012

У меня есть BackgroundWorker, который создает таймер. Таймер совершает повторные звонки на DataTable. Я хочу, чтобы событие BackgroundWorker.RunWorkerCompleted вызывалось только при остановке таймера. Как мне это сделать?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 30 января 2012

Просто создайте цикл в обработчике событий 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 и т. Д.)

1 голос
/ 30 января 2012

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();
    }
}
...