2013-03-16 18 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); 
} 

讓我知道這是如何解決你的。

相關問題