Backgroundworker подписка на события



У меня есть форма. Форма имеет логический класс, который что-то делает. Я хочу, чтобы форма была отзывчивой, пока это что-то делается, поэтому я создаю объект BackgroundWorker.
Я также хочу получать обновления из класса логики в форму. Я думал использовать событие обновления прогресса BackgroundWorker.


Так что я подписываюсь методом на форму к работнику.событие ProgressChanged.



public class MyForm : Form
{
private LogicClass logicObject;

public void StartOperation()
{
BGWorkerBase worker = new BGWorkerBase(logicObject);
worker.DoWork += new DoWorkEventHandler(DoOperation);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(OperationComplete);
worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
worker.RunWorkerAsync();
}

public void DoOperation()
{
logicObject.DoSomething();
}

private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// Update form
}
}


Я создал custome Backgroundworker, который подписывается на событие update класса logic и вызывает событие ProgressChanged:



public class BGWorkerBase : BackgroundWorker
{
public BGWorkerBase(LogicClass logicObject)
{
// connection is the logic class. it has an update event
logicObject.UpdatePublished += new EventHandler(connection_UpdatePublished);
this.WorkerReportsProgress = true;
}
// Here I invoke the backgroundworker OnProgressChangedEvent
private void connection_UpdatePublished(object sender, EventArgs e)
{
OnProgressChanged(new ProgressChangedEventArgs(0, e));
}
}


Проблема заключается в том, что при повторном запуске операции обновление публикуется несколько раз. Я проверил и обнаружил, что объект connection имеет несколько рабочих, подписанных на событие publish. Так что, похоже, я создал здесь 2 проблемы:

1. Одно событие публикуется несколько раз.
2. Я сохраняю ссылку в объекте connection на backgroundworkers, которые должны были быть удалены, как только они закончили свою работу. работа.


Как лучше всего это исправить? Я могу удалить подписку рабочего, когда он завершит свою работу, но это кажется грязным. Есть ли лучший способ справиться с этой ситуацией?

564   1  

1 ответ:

Вы должны отписаться от события, когда работник закончит. Т. е. где-то в коде вы должны добавить следующее:

logicObject.UpdatePublished -= connection_UpdatePublished;

Это приведет к удалению обработчика событий из списка делегатов, зарегистрированных для обработки события UpdatePublished.

Этот вопрос/ответ SO объясняет, как вы можете случайно создать утечку памяти, используя события: Почему и как избежать утечки памяти обработчика событий?

Comments

    Ничего не найдено.