我有一个后台工作程序,可以进行许多GUI交互,但我的问题是所有这些对象都在主线程中(据我所知),我需要一直调用所有这些,正在制作的东西我的代码更长,更不易阅读 1)您知道如何创建一个调用这些GUI元素的通用方法 2)有没有更简单的方法来对付这个?
提前致谢。
答案 0 :(得分: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类型。你可以把任何你想要的东西放在另一边,并把它扔到正确的类型。