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

Sco*_*ain 6 .net c# 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;
}
Run Code Online (Sandbox Code Playgroud)

或者我能做到这样的边缘案例?我没有在MSDN上看到任何关于它的信息,说它不被允许,并且它(到目前为止)在我的程序中正常运行,但是我想在这里查看是否有人遇到麻烦这样做.

msa*_*het 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();
}
Run Code Online (Sandbox Code Playgroud)

并以任何方式处理你的完成

private void bgWork_Process_CompletedHandler(object sender, EventArgs e)
{
    bgWork_Process.DoWork -= DoWorkAction;
}
Run Code Online (Sandbox Code Playgroud)

然而,我确实感觉到;最好将BackGroundWorkers您需要执行的所有操作分开,而不是共享类似的操作或包装在一个类中,这样您就可以更清楚自己在做什么。