2011-10-27 80 views
4

我有一個後臺工作,做許多GUI交互,但我的問題是,所有這些對象都在主線程(我知道),我需要調用所有的所有的時間,這會讓我的代碼變得更長,並且不易讀。
1)你知道我如何創建一個將調用這些GUI元素的通用方法。
2)有沒有更簡單的方法來解決這個問題?背景工人代表與調用者

在此先感謝。

+1

這只是做錯了,你不應該使用在BGW線程開始/ Invoke的。 ProgressChanged和RunWorkerCompleted事件旨在執行此操作。關注僅在工作人員中生成數據。並用事件處理程序中的數據更新UI。 –

+0

@HansPassant,我怎樣才能傳遞數據? – funerr

回答

3

隨着BackgroundWorker的,你可以ReportProgress,並通過完成百分比和對象。您可以創建一個類來包含要傳遞給UI的數據,然後將其作爲對象傳遞。

ProgressChanged事件可以操作UI對象,因爲它會在UI線程中運行。

例如,對於你的問題

private void Form1_Load(object sender, EventArgs e) 
    { 
     backgroundWorker1.RunWorkerAsync(); 
    } 

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     List<string> items = new List<string>(); 

     items.Add("Starting"); 
     System.Threading.Thread.Sleep(2500); 
     backgroundWorker1.ReportProgress(25, items.ToArray()); 

     items.Add("Halfway there"); 
     System.Threading.Thread.Sleep(2500); 
     backgroundWorker1.ReportProgress(50, items.ToArray()); 

     items.Add("Almost there"); 
     System.Threading.Thread.Sleep(2500); 
     backgroundWorker1.ReportProgress(75, items.ToArray()); 

     items.Add("Done"); 
     System.Threading.Thread.Sleep(2500); 
     backgroundWorker1.ReportProgress(100, items.ToArray()); 
    } 

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     listBox1.Items.Clear(); 
     listBox1.Items.AddRange((string [])e.UserState); 
     this.Text = e.ProgressPercentage.ToString(); 
    } 

在ReportProgress第二個參數是Object類型。你可以放任何你想要的東西,並將它投射到另一邊的適當類型。

+0

感謝您的例子,但我需要將生成的數據發送到ProgressChanged,我有一個數組現在保存數據,但我不知道如何將它傳遞到那裏+我不想改變進度百分比。 – funerr

+0

在ReportProgress中傳遞數組作爲第二個參數。它映射到ProgressChanged事件中的UserState。將UserState投射到您的陣列。 –

+0

已更新,以演示如何通過UserState變量傳遞數組。 –