2011-09-15 33 views
0

編輯:我通過在代碼中創建後臺工作器來解決問題,而不是在設計中拖放。Background Worker問題

現在我知道如何使用後臺工作。

問題

這是使用BGWorker我的第一次,所以這是我的問題......

  • 光標不會更改爲「等待」。
  • 進度條不更新。
  • RunWorkerCompleted未被調用。

但文本框確實更新。

我做錯了什麼?

守則

using System; 
using System.ComponentModel; 
using System.Windows.Forms; 

namespace BGWorker 
{ 
    public partial class Main : Form 
    { 
     public Main() 
     { 
      InitializeComponent(); 
      progressBar1.Minimum = 0; 
      progressBar1.Value = 0; 
      progressBar1.Maximum = 100; 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Cursor.Current = Cursors.WaitCursor; 
      backgroundWorker1.RunWorkerAsync(); 
     } 

     private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      for (int i = 1; i <= 100; i++) 
      { 
       textBox1.AppendText(i.ToString()); 
       textBox1.AppendText("\n"); 
       backgroundWorker1.ReportProgress(i); 
      } 
     } 

     private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 
      progressBar1.Value = e.ProgressPercentage; 
     } 

     private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      if (e.Error != null) 
      { 
       label1.Text = e.Error.Message; 
      } 

      else 
      { 
       label1.Text = "All Done !"; 
       Cursor.Current = Cursors.Default; 
      } 

     } 
    } 
} 

感謝。

+1

1)**不要**從'DoWork'事件訪問UI元素。這個「規則」是很好的理由,即使這個特殊情況「有效」:-) 2)連接事件的代碼在哪裏? – 2011-09-15 04:06:10

+0

對不起,我忘了(1)...我沒有訪問我的原始項目中的任何用戶界面。 關於(2),我的代碼不會工作,還需要什麼? – vs2010noob

+0

確保事件已連線。 VS生成器會將所有代碼放入分部類的'InitializeComponent'方法中 - 它可以手動檢查(以及相關部分copy'n'paasted for「proof」:-),儘管它也應該在UI設計器事件屬性。 – 2011-09-15 05:37:17

回答

1

我同意pst。

  1. 始終在代碼中創建你的工人背後 - 拖放在窗體上從來都不是一個好主意
  2. 你永遠不會從DoWork的訪問UI元素。您只能通過ReportProgress和RunWorker完成事件
  3. 您的if語句段應該包含最常見的路徑,其中最不常見的路徑是else。

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
        StringBuilder sb = new StringBuilder(); 
        for (int i = 1; i <= 100; i++) 
        { 
         sb.AppendLine(i.ToString()); 
         backgroundWorker1.ReportProgress(i); 
        } 
        e.Result = sb.ToString(); 
    } 
    
    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
        if (e.Error == null) 
        { 
         textbox1.Text = e.Result.ToString(); 
         label1.Text = "All Done !"; 
         Cursor.Current = Cursors.Default; 
        } 
    
        else 
        { 
         label1.Text = e.Error.Message; 
        } 
    } 
    
+0

謝謝,但應用上面的代碼,沒有任何工作:( – vs2010noob

+0

代碼不起作用,但我用你給的3個技巧,解決了這個問題,謝謝:) – vs2010noob

相關問題