在RunWorkerCompleted WinForms.net中运行BackGroundWorker

在RunWorkerCompleted WinForms.net中运行BackGroundWorker,.net,winforms,backgroundworker,.net,Winforms,Backgroundworker,我知道在RunWorkerComplete1中运行BackgroundWorker2是否危险,如下所示: public void backgroundworker1RunComplete (Object sender , RunworkerCompleteEvent e) { Backgroundworker2.runAsync(); } 可能会出现任何死锁、各种问题等? 因为也许我只有两个选择: 在RunComplete1中运行BackgroundWorker2 async,或使用手

我知道在RunWorkerComplete1中运行BackgroundWorker2是否危险,如下所示:

public void backgroundworker1RunComplete (Object sender , RunworkerCompleteEvent e)
{
    Backgroundworker2.runAsync();
}
可能会出现任何死锁、各种问题等? 因为也许我只有两个选择:

在RunComplete1中运行BackgroundWorker2 async,或使用手动重置事件,当我输入BackGroundWorker DoWork1并在WorkerComplete1中设置时,我会在其中重置

第一

  private void BackgroundWorker1RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  {
       backgroundWorker2.RunAsync();
  }
二号

 private void BackgroundWorker1RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  {
       manualReset.Set();  
  }

 private void BackGrounWorker2DoWork(Object sender , DoWorkEventArgs e)
 {
   manualReset.WaitOne();
  //Do Stuff
 }

背景线程启动背景线程基本上就是你在这里做的是完全有效的。我已经看到并构建了依赖于此的算法,甚至有一次,同一个BGW使用不同的命令重新启动自身,触发了不同的逻辑(不是我的设计),我对它有问题,但它完成了任务

您只需确保您知道您和您的后台线程正在做什么,以及它们不应该做什么:

确保没有可能的死锁,两个BGW都在等待另一个BGW完成。在这种情况下,BGW1启动了BGW2,但它尚未运行,而且似乎在运行之后就完成了,所以这不太可能。但是,如果两者同时运行并等待另一个在任何给定点完成,或者在不同对象上获取锁(两个BGW都需要这两个对象),则可能会出现问题

永远不要试图直接从表单的BGW获取或设置属性/字段值或调用方法。如果必须这样做,请使用Control.Invoke或Control.BeginInvoke。您可以通过一两个简单的扩展方法来避免了解差异

这里的扩展方法似乎是格式化程序中的一个bug;不能在列表中间放置代码块:

public static void InvokeIfNecessary(this Control ctrl, Action action)
{
    if(ctrl.InvokeRequired)
    {
       ctrl.Invoke((MethodInvoker)action);
       return;
    }

    action();
}
您可以在此基础上创建其他变体以获取或返回值,但是如果明智地使用外部闭包,您几乎可以将其用于任何事情

关闭BGWs的包含表单时,不要忘记等待或取消BGWs。这可能需要您构造doWork方法和它直接调用的长时间运行的方法,以了解当从外部发出信号时是否以及何时退出。
谢谢你的澄清!根据BackgroundWorker文档,BackgroundWorker没有RunAsync方法,您是说RunWorkerAsync吗?此处的文档: