【发布时间】:2014-08-14 18:39:15
【问题描述】:
问题的名称是:“从后台工作人员更新 GUI”,但正确的名称是:“从后台工作人员更新 GUI 或报告多变量(其他比整数)来自后台工作人员“
请让我解释一下我的情况。在一个程序中,我有一个后台工作人员来分析信息。作为这种分析的结果 - 表单 GUI 元素应该填充必要的数据。在 GUI 中我想更新
- 2 个数据网格视图
- 1 个列表框
- 5 个标签
据我了解 - 我只能通过后台工作人员的 ReportProgress() 方法本地报告 1 int 值。
所以问题是 - 我如何通过ReportProgress() 传递List<>(+ 一些其他变量:string、int)?基本上 - 我想用信息更新 GUI,但“1 个整数”是不行的。所以要么应该可以通过 ReportProgress() 传递多个变量,要么我可以在 BackgroundWorker 内部使用 Invoke自己更新 GUI。我个人不喜欢 Invoke 方法...你有什么意见?
这是我的代码(参见 cmets):
private void button9_Click(object sender, EventArgs e) // start BW
{
bw.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
bw.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
bw.WorkerReportsProgress = true;
bw.WorkerSupportsCancellation = true;
bw.RunWorkerAsync(10);
}
private void button10_Click(object sender, EventArgs e) // cancel BW
{
bw.CancelAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
int count = (int)e.Argument;
for (int i = 1; i <= count; i++)
{
if (bw.CancellationPending)
{
e.Cancel = true;
break;
}
List<List<string>> list_result = new List<List<string>>();
list_result = Proccess();
bw.ReportProgress(list_result.Count()); // right now I can only return a single INT
/////////// UPDATE GUI //////////////
// change datagridview 1 based on "list_result" values
// change datagridview 2
// change listbox
// change label 1
// change label ..
Thread.Sleep(20000);
}
MessageBox.Show("Complete!");
e.Result = sum;
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
prog_count++;
listBox1.Items.Add("Count: (" + prog_count.ToString() + "/20). Found: " + e.ProgressPercentage.ToString() + ".");
}
【问题讨论】:
-
你不喜欢
Invoke的什么地方? -
ReportProgress 还有一个UserState 可以传递的对象。
-
@Savanna 并不是我讨厌它。我正在为我目前的解决方案寻找一个替代/更好的观点;)也许通过从 BW 转移到“新线程”将是一个解决方案.. 就我个人而言,我不喜欢调用,因为我必须检查“如果 InvokeRequired,那么……”但同样 - 如果没有其他选择,那么我将不得不坚持使用这个
标签: c# multithreading winforms backgroundworker