在调用RunWorkerAsync之后但在函数退出之前取消订阅DoWork是否安全?

时间:2011-09-15 14:44:42

标签: c# .net backgroundworker

我有很多方法(它们一次只运行一个),它们都使用相同的RunWorkerCompleatedProgressChanged方法,但它们都有不同的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 个答案:

答案 0 :(得分:1)

在完成事件处理程序之前,您可以采取哪些措施来确保事件处理程序不会被删除,而是执行与

类似的操作
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而不是与之共享类似的操作或包装在类中可能更好,这样你就可以更清楚你正在做什么。 / p>