2012-04-12 49 views
1

我是.net世界的新手,所以我面临一些问题,请帮助我,这里是其中之一,我有一个for循环,我有一个backgroundWorker控件和一个progressBar控制,也有1个按钮,即id:“btnPause”。所以我的要求是当我的表单将加载peogressbar将显示它已完成多少进展,每当我点击按钮(btnPause)按钮文本需要改变并设置文本为暂停,然后每当我再次点击该按钮时,它需要从它暂停的值恢复。请帮助我。如何在Windows窗体中暂停backgroundWorker

在此先感谢。

+0

我们展示BackgroundWorker的代码,请... – Marco 2012-04-12 13:22:05

+0

这是一个重复的,我认为 - 在这里看到这个答案http://stackoverflow.com/questions/ 10047571 /适当的方法临时挂起一个工作者线程/ 10047990#10047990 – NSGaga 2012-04-12 13:34:18

+0

你可以尝试封装一个backgroundworker在一个也包含当前进度值的类中。因此,当您暂停(在这种情况下取​​消异步操作)时,它只会保留进度值,因此下一次再次启动操作时,您可以恢复到上一个​​进度值。希望这可以帮助。 – cubski 2012-04-12 13:43:02

回答

0

尝试使用此

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);  
     } 
    } 
} 
+0

感谢您的编辑。 – Likurg 2012-04-12 13:37:47

1

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

有几种方法可以将BackgroundWorker保持在此暂停状态。我的方法是使用ManualResetEvent。这允许BackgroundWorker线程进入睡眠状态并在事件设置时出现。我认为这比使用带睡眠体的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. 
    } 
}