代码之家  ›  专栏  ›  技术社区  ›  Blorgbeard

我该如何“穿线,加入”一个后台工作人员?

  •  4
  • Blorgbeard  · 技术社区  · 17 年前

    假设我给用户看一个表单,并使用后台工作人员在后台做一些工作。

    当用户单击OK时,在BackgroundWorker完成之前,我无法继续。 如果用户单击“确定”时未完成,我希望显示一个waitcursor,直到它完成为止,然后继续。

    实现这一点的最佳方法是什么?

    我知道我可以用普通的旧线,然后做线。加入,但我喜欢背景工作者。

    做得好吗?

    4 回复  |  直到 17 年前
        1
  •  8
  •   Sergey Mirvoda    17 年前

    你可以使用这个代码,而不是bw

    var resetEvent = new ManualResetEvent(false);
    ThreadPool.QueueUserWorkItem(state =>
                    {
                        Thread.Sleep(5000);//LongRunning task, async call
                        resetEvent.Set();
                    });
    resetEvent.WaitOne();// blocking call, when user clicks OK 
    
        2
  •  8
  •   Jon Skeet    17 年前

    理想情况下,您应该禁用表单上的所有相关控件,然后在 BackgroundWorker 完成。这样你就不会得到一个被锁定的用户界面-你可以有一个取消按钮等。

    如果你想的话 事实上 在任务完成之前,可以同步运行任务以开始。

        3
  •  2
  •   Gaurav    17 年前

    您可以检查BackgroundWorker是否正在运行,并在btnok单击事件处理程序中检查bw.isbusy是否为true。如果是这样,请更改光标并设置一个布尔标志,指示OK处理程序正在等待。当BackgroundWorker完成其作业时,检查OK是否一直在等待,如果正在等待,则将标志设置为false,更改光标并执行OK按钮的作业。-)

        4
  •  0
  •   Wembley    17 年前

    我只需要使用布尔标记和锁。

    object waitlock = new object();
    bool isBackgroundWorkerCompleted = false;
    bool isOKButtonPressed = false;
    
    private void onPress(...) 
    {
        lock(waitlock) 
        {
          isOKButtonPressed = true;
          if (isBackgroundWorkerCompleted) DoNextStep();
          else cursor.Wait(); //psuedo-code - use whatever the actual call is...
        }
    }
    

    后台线程执行相同的技巧(只需记住返回到主UI线程)

    推荐文章