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

我有很多方法(它们一次只运行一个),它们都使用相同的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上看到任何关于它的信息,说这是不允许的,并且它(到目前为止)在我的程序中正常运行,但我想在这里查看是否有人遇到麻烦这样做。

您可以做些什么来确保在完成事件处理程序之前不会删除事件处理程序将执行类似的操作

 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可能更好,这样您就可以更清楚地了解自己在做什么。