召回后台工作人员的正确方法

本文关键字:方法 后台 工作人员 召回 | 更新日期: 2023-09-27 17:54:20

在标题中,我有一些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
}
或者我应该添加RunWorkerCompleted事件与"bgw = null;"代码或类似的东西?

召回后台工作人员的正确方法

    您应该避免将bgw设置为静态,因为您正在非静态上下文中使用它。
  1. 当我需要根据UI事件频繁地重新运行worker时,我通常使用以下结构:
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
   }
}

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

这段代码并不能确保worker将运行用户按下按钮的次数,也不能确定在你的情况下是否需要这样做。