2013-03-16 62 views
0

我是C#中的新成员。我发现了一些在进度条上工作的代码。什么是当有人点击按钮开始btnStartAsyncOperation_Click进度条开始增加,当按下btnCancel_Click它取消操作。这里是代码恢复线程并在另一个按钮上工作

namespace BackgroundWorkerSample 
{ 
    public partial class Form1 : Form 
    {  
     BackgroundWorker m_oWorker; 

     public Form1() 
     { 
      InitializeComponent();   
      m_oWorker = new BackgroundWorker(); 
      m_oWorker.DoWork += new DoWorkEventHandler(m_oWorker_DoWork); 
      m_oWorker.ProgressChanged += new ProgressChangedEventHandler(m_oWorker_ProgressChanged); 
      m_oWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(abcd); 
      m_oWorker.WorkerReportsProgress = true; 
      m_oWorker.WorkerSupportsCancellation = true; 
     } 

     void abcd(object sender, RunWorkerCompletedEventArgs e) 
     {   
      if (e.Cancelled) 
      { 
       lblStatus.Text = "Task Cancelled."; 
      } 
      else if (e.Error != null) 
      { 
       lblStatus.Text = "Error while performing background operation."; 
      } 
      else 
      { 
       lblStatus.Text = "Task Completed..."; 
      } 
      btnStartAsyncOperation.Enabled = true; 
      btnCancel.Enabled = false; 
     } 

     void m_oWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 
      progressBar1.Value = e.ProgressPercentage; 
      lblStatus.Text = "Processing......" + progressBar1.Value.ToString() + "%"; 
     } 

     void m_oWorker_DoWork(object sender, DoWorkEventArgs e) 
     { 

      for (int i = 0; i < 100; i++) 
      { 
       Thread.Sleep(100); 
       m_oWorker.ReportProgress(i); 
       if (m_oWorker.CancellationPending) 
       { 
        e.Cancel = true; 
        m_oWorker.ReportProgress(0); 
        return; 

       } 

      } 

      //Report 100% completion on operation completed 
      m_oWorker.ReportProgress(100); 
     } 

     private void btnStartAsyncOperation_Click(object sender, EventArgs e) 
     { 
      btnStartAsyncOperation.Enabled = false; 
      btnCancel.Enabled    = true; 
      //Start the async operation here 

      m_oWorker.RunWorkerAsync(); 

     } 

     private void btnCancel_Click(object sender, EventArgs e) 
     { 

      if (m_oWorker.IsBusy) 
      { 
       //Stop/Cancel the async operation here 
       m_oWorker.CancelAsync(); 
      } 
     } 

     private void progressBar1_Click(object sender, EventArgs e) 
     { 

     } 

     private void lblStatus_Click(object sender, EventArgs e) 
     { 

     } 

     private void button1_Click(object sender, EventArgs e) 
     { 


      } 

     private void button2_Click(object sender, EventArgs e) 
     { 

     } 
     } 
    } 

现在我又添加了2个按钮,button1暂停和button2恢复。由于我找不到任何恢复方法,因此在按暂停时我不得不使用CancelAsync()函数,并将进度条的值保存在全局变量中。然后,当我按简历时,我再次使用RunWorkerAsync开始进度栏。但问题是,我无法在此函数中发送全局变量的值,因此它从0进度开始。

我尝试使用thread.sleep(infinite time here)当有人按暂停,然后停止线程时,有人按简历。问题仍然是,在这种情况下我无法按任何按钮。如果我启用按钮,他们不工作。

请给我一些解决方案。

+0

你应该查找async/await或Reactive Extensions。非常适合这些类型的问题。 – 2013-03-16 19:09:24

+0

@MeirionHughes您能否给我一些链接 – asdfkjasdfjk 2013-03-16 20:05:47

回答

0

你可以尝试拥有自己的变量,即

bool isPaused = false; 

当有人点击您的暂停按钮...

isPaused = true; 

它当有人点击的简历设置为false。最后,在您的doWork方法的for循环中,使其等待,直到该变量为false。

while (isPaused) 
{ 
    Thread.Sleep(100); 
} 

让我知道这是如何解决你的。

相关问题