Безопасно ли отписываться от DoWork после вызова RunWorkerAsync, но до выхода из функции? - PullRequest
6 голосов
/ 15 сентября 2011

У меня много методов (они запускаются только по одному за раз), все они используют одни и те же методы RunWorkerCompleated и ProgressChanged, но все они имеют разные методы Dowork.Безопасно ли делать следующее:

private void button_Process_Click(object sender, EventArgs e)
{
    bgWork_Process.DoWork += Scrub_DoWork;
    bgWork_Process.RunWorkerAsync();
    bgWork_Process.DoWork -= Scrub_DoWork;
}

или я могу сделать это в крайнем случае?В MSDN на нем не было ничего, что говорило, что это не разрешено и что (пока) нормально работает в моей программе, но я хотел проверить здесь, чтобы выяснить, не сталкивался ли кто-нибудь с такими проблемами.

1 Ответ

1 голос
/ 15 сентября 2011

То, что вы можете сделать, чтобы убедиться, что обработчик событий не будет удален, пока вы не покончили с ним, это сделать что-то похожее на

Action DoWorkAction;

private void button_Process_Click(object sender, EventArgs e)
{
    gbHistory.Enabled = false;
    gbScrub.Enabled = false;
    DoWorkAction = new Action(Scrub_DoWork);
    bgWork_Process.DoWork += DoWorkAction;
    bgWork_Process.RunWorkerAsync();
}

И во что бы то ни стало обрабатывает ваше завершение

private void bgWork_Process_CompletedHandler(object sender, EventArgs e)
{
    bgWork_Process.DoWork -= DoWorkAction;
}

Я чувствую, однако; что может быть лучше просто иметь отдельное BackGroundWorkers для всех ваших действий, которые вам нужно выполнить, вместо того, чтобы делиться с ним подобным или обернуть в классе, чтобы вы могли быть более ясными в том, что вы делаете.

...