Перезагрузите фоновый рабочий - PullRequest
5 голосов
/ 17 июня 2009

Есть ли способ напрямую "перезапустить" фонового работника? Вызов CancelAsync (), за которым следует RunWorkerAsync (), явно не сделает этого, как подразумевают их имена.

Справочная информация: У меня есть фоновый работник, который вычисляет общее количество в моем приложении Windows Forms .net 2.0. Всякий раз, когда пользователь изменяет любое значение, которое является частью этой общей суммы, я хотел бы перезапустить фонового работника, если он будет работать так, чтобы непосредственно учитывались последние значения.

Ответы [ 4 ]

8 голосов
/ 17 июня 2009

Сама фоновая работа не дает никаких повреждений.

Когда вы вызываете bgw.CancelAsync, он устанавливает флаг фонового работника, который вам нужно проверить в обработчике DoWork.

что-то вроде:

bool _restart = false;

private void button1_Click(object sender, EventArgs e)
{
    bgw.CancelAsync();
    _restart = true;
}

private void bgw_DoWork(object sender, DoWorkEventArgs e)
{

    for (int i = 0; i < 300; i++)
    {
        if (bgw.CancellationPending)
        {
            break;
        }
        //time consuming calculation
    }
}

private void bgw_WorkComplete(object sender, eventargs e)  //no ide to hand not sure on name/args
{
    if (_restart)
    {
        bgw.RunWorkerAsync();
        _restart = false;
    }

}
2 голосов
/ 17 июня 2009

Есть несколько вариантов, все зависит от того, как вы хотите снять шкуру с этой кошки:

Если вы хотите продолжать использовать BackgroundWorker, то вам нужно уважать модель, которая была установлена, то есть одну из «чувствительности к прогрессу». Материал внутри DoWork явно необходим для того, чтобы всегда быть в курсе того, должна ли произойти ожидающая отмена (т. Е. В цикле DoWork должен быть определенный объем опроса).

Если ваш код расчета монолитный и вы не хотите с ним связываться, не используйте BackgroundWorker, а просто запустите свой собственный поток - таким образом, вы можете принудительно убить его, если потребуется.

0 голосов
/ 31 июля 2014

Я хочу оставить свои запросы запущенными, но больше не беспокоюсь о результатах. Я переопределяю значение фонового рабочего (мой занятый счетчик использует флаг isBusy).

    private void SearchWorkerCreate() {
        this.searchWorker = new BackgroundWorker();
        this.searchWorker.DoWork += this.SearchWorkerWork;
        this.searchWorker.RunWorkerCompleted += this.SearchWorkerFinish;
    }

    private void SearchWorkerStart(string criteria){
        if(this.searchWorker.IsBusy){
            this.SearchWorkerCreate();
        }
        this.searchWorker.RunWorkerAsync(criteria);
        this.OnPropertyChanged(() => this.IsBusy);
        this.OnPropertyChanged(() => this.IsIdle);
    }
0 голосов
/ 17 июня 2009

Вы можете перехватить обработчик события изменения для элементов управления, в которых изменяются значения, и сделать следующее в обработчике:

if(!bgWrkr.IsBusy)
     //start worker
else if(!bgWrkr.CancellationPending)
  bgWrkr.CancelAsync();

Надеюсь, это поможет вам!

...