我有一個後臺工作,做許多GUI交互,但我的問題是,所有這些對象都在主線程(我知道),我需要調用所有的所有的時間,這會讓我的代碼變得更長,並且不易讀。
1)你知道我如何創建一個將調用這些GUI元素的通用方法。
2)有沒有更簡單的方法來解決這個問題?背景工人代表與調用者
在此先感謝。
我有一個後臺工作,做許多GUI交互,但我的問題是,所有這些對象都在主線程(我知道),我需要調用所有的所有的時間,這會讓我的代碼變得更長,並且不易讀。
1)你知道我如何創建一個將調用這些GUI元素的通用方法。
2)有沒有更簡單的方法來解決這個問題?背景工人代表與調用者
在此先感謝。
隨着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類型。你可以放任何你想要的東西,並將它投射到另一邊的適當類型。
感謝您的例子,但我需要將生成的數據發送到ProgressChanged,我有一個數組現在保存數據,但我不知道如何將它傳遞到那裏+我不想改變進度百分比。 – funerr
在ReportProgress中傳遞數組作爲第二個參數。它映射到ProgressChanged事件中的UserState。將UserState投射到您的陣列。 –
已更新,以演示如何通過UserState變量傳遞數組。 –
這只是做錯了,你不應該使用在BGW線程開始/ Invoke的。 ProgressChanged和RunWorkerCompleted事件旨在執行此操作。關注僅在工作人員中生成數據。並用事件處理程序中的數據更新UI。 –
@HansPassant,我怎樣才能傳遞數據? – funerr