如何在 Windows 窗体中暂停后台工作线程

本文关键字:暂停 后台 工作 线程 窗体 Windows | 更新日期: 2023-09-27 18:31:05

我是.net世界的新手,所以我遇到了一些问题,请帮助我,这是其中之一,我有一个for循环,我有一个backgroundWorker 控件和一个进度栏控件,还有1个id:"btnPause"的按钮。所以我的要求是当我的表单加载时,peogressbar 将显示它已完成的进度,每当我单击按钮(btnPause)时,按钮文本需要 b 更改并将文本设置为暂停,然后每当我再次单击该按钮时,它都需要从它暂停的值恢复。请帮助我。

提前谢谢。

如何在 Windows 窗体中暂停后台工作线程

我的方法是使用布尔标志让我知道操作是否已暂停(也许第二个标志让我知道操作是否已取消)。 当用户按下暂停按钮时,您将 IsPaused 标志设置为 true,以便在工作人员开始处理下一个项目时,它可以检查此标志并知道进入等待状态。

有几种方法可以使后台工作线程保持此暂停状态。 我的方法是使用ManualResetEvent。 这允许后台工作线程进入睡眠状态,并在设置事件时出来。 我认为这比对睡眠体使用 while 循环要好,因为线程在设置事件之前一直处于睡眠状态,而不是醒来检查它是否应该仍然处于睡眠状态。 当用户希望继续时,它可以设置此事件并让后台工作线程继续。

所以代码看起来有点像这样:

private void backgroundWorker_doWork(object sender, DoWorkEventArgs args)
{
   //Initialize any pre-work stuff here.
   while(!finished)
   {
       if (Paused)
          m_evtPause.WaitOne();
       if (Cancelled)
          break;
       //lengthy thread procedure code.
   }
}

尝试使用这个

class MyWorkerClass
{
    volatile bool m_bPaused  = false;
    // Public property to control worker execution
    public bool Paused 
    {
        get { return m_bPaused; }
        set { m_bPaused = value; }
    }
    long ThreadFunc (BackgroundWorker worker, DoWorkEventArgs e)
    {
        ...
        // While Paused property set to true
        while (m_bPaused)
        {
            // Pause execution for some time
            System.Threading.Thread.Sleep (100);      
        }
    }
}