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

6

我有很多方法(但它们一次只能运行一个),它们都使用相同的RunWorkerCompletedProgressChanged方法,但它们都有不同的DoWork方法。做以下操作是否安全:

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

我能这样做吗,还是会遇到某些特殊情况?我在MSDN上没有看到任何不允许这样做的信息,并且在我的程序中运行得很好,但我想在这里检查一下是否有人在这方面遇到了麻烦。


是的,它是安全的。另一种方法是线程。 - Emaad Ali
1个回答

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;
}

然而,我确实觉得,与其共享一个类似的BackGroundWorker或者将其包装在一个类中以便更清楚地说明你所做的事情,也许更好的方法是为你需要执行的所有操作都创建单独的BackGroundWorker


我认为我最终会像你建议的那样使用单独的后台工作线程,但我仍然想知道我在原帖中所做的事情是否安全可靠,能否给出明确的肯定或否定答复。 - Scott Chamberlain
@ScottChamberlain 我非常确定这是安全的,因为事件模式的工作方式是,事件会在RunWorkerAsync上触发,该方法启动后台工作者,该工作者已经具有DoWork委托的委托,然后您在所有这些操作完成之后将其删除。 - msarchet
谢谢,但是我应该在什么时候和哪里取消 BackgroundWorker 上的 RunWorkerCompleted - Agent007
你可以在处理程序中注销它。 - msarchet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接