Лучший способ использовать System.ComponentModel.BackgroundWorker с лямбда-выражением в C # - PullRequest
3 голосов
/ 03 марта 2011

Я хочу знать лучший способ сделать это:

using (var backgroundWorker = new BackgroundWorker())
{
    DoWorkEventHandler doWorkHandler = null;
    doWorkHandler = (s, e) =>
        {
            //Some expensive code goes here...
            backgroundWorker.DoWork -= doWorkHandler;
            //or
            //((BackgroundWorker)s).DoWork -= doWorkHandler;
        };
    backgroundWorker.DoWork += doWorkHandler;

    RunWorkerCompletedEventHandler workerCompleted = null;
    workerCompleted = (s, e) =>
        {
            //Update IU or something...
            backgroundWorker.RunWorkerCompleted -= workerCompleted;
            //or
            //((BackgroundWorker)s).RunWorkerCompleted -= workerCompleted;
        };
    backgroundWorker.RunWorkerCompleted += workerCompleted;

    backgroundWorker.RunWorkerAsync();
}

х

  1. Я предполагаю, что мне действительно нужно удалить обработчик, чтобы избежать утечки или чего-то еще. Верно?
  2. Ведьма - лучшая, получить доступ к экземпляру BackgroundWorker через параметр "s" или через переменную backgroundWorker? Это тоже самое?

Ответы [ 2 ]

2 голосов
/ 03 марта 2011

Нет необходимости удалять обработчик, если только вы не используете тот же экземпляр BackgroundWorker где-то еще. Однако, учитывая, что вы окружаете его с помощью использования, это не должно быть проблемой (в данном случае область вашего работника - это оператор использования).

Кроме того, доступ к экземпляру backgroundWorker должен работать в любом случае, однако при циклическом переключении данных я часто предпочитаю использовать userState, который возвращается в RunWorkerCompletedEventArgs.

1 голос
/ 03 марта 2011

1) Что именно вы имеете в виду? Удалить "doWorkHandler"? Если это так, вам не нужно это делать (насколько я знаю). Точно так же, как сказал Ale , вам просто нужно это повторно использовать ту же BGW.

Но если бы использовал , я бы не пошел по этому пути. Просто мой способ реализации, но для bgw я бы придерживался переменной, содержащейся в классе.


2) Доступ будет работать в обоих направлениях (общее использование). «Лучше» использовать «s», но вам придется вводить все, чтобы код стал сложнее для чтения. Лично я бы вместо объявления "s" использовал объявление переменной (прямой доступ).


Теперь есть что-то новое. Посмотрите на библиотеку задач. Может быть, это очень удачный способ (я обнаружил, что во многих случаях это лучше и проще, чем использование Background Worker). А также вы можете создавать параллельные задачи =)

...