正确的方法来重新调用backgroundworker

时间:2015-06-07 01:23:22

标签: c#

在标题中,我有一些bgw我想在按下每个按钮时调用。 这段代码是否正确?

private static BackgroundWorker bgw = null;
private void bttn_Click(...)
{
   if(!bgw.IsBusy)
      doSomeWorkInBg();
   else
      MessageBox.Show("Slow down a bit");
}

private void doSomeWorkInBg()
{
     if (bgw == null)
        {
            bgw = new BackgroundWorker();
            bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
        }
        bgw.RunWorkerAsync();
}

private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
   // do some work that takes time
}

或许我应该用" bgw = null;"添加RunWorkerCompleted事件。代码或类似的东西?

1 个答案:

答案 0 :(得分:0)

  1. 您应该避免使bgw静态,因为您在非静态环境中使用它。
  2. 当我需要根据UI事件频繁地重新运行worker时,这是我经常使用的构造:
  3. bool ShouldRunWorkedASAP;
    
    private void bttn_Click(...){
     ShouldRunWorkedASAP=true;
     if (!bgw.IsBusy) bgw.RunWorkerAsync();
    }
    
    private void bgw_DoWork(object sender, DoWorkEventArgs e)
    {
       while (ShouldRunWorkedASAP) {
         ShouldRunWorkedASAP=false;
         // do some work that takes time
       }
    }
    

    这假设工作在类构造函数中实例化。基本上,此代码设置工作程序应在AS事件发生时尽快运行的标志,然后尝试运行该工作程序。如果它已经在运行 - 那么worker实现中的while()循环将在完成后立即为下一次运行调度作业。

    此代码不能确保工作人员完全按照用户按下按钮的次数运行,不确定在您的情况下是否需要这样做。