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

本文关键字:DoWork 安全 取消 RunWorkerAsync 调用 函数 退出 | 更新日期: 2023-09-27 18:08:55

我有很多方法(它们一次只运行一个),它们都使用相同的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上看到任何东西说它是不允许的,它(到目前为止)在我的程序中运行良好,但我想在这里检查一下,看看是否有人在这样做时遇到了麻烦。

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

要确保事件处理程序在完成之前不会被删除,您可以做类似于

的事情
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为您所有的行动,你需要执行,而不是共享一个类似的一个或包装在一个类,这样你可以更清楚你在做什么。