【发布时间】:2012-10-24 17:10:17
【问题描述】:
我遇到了一个小问题。我有两个线程,一个执行一个循环,每次都需要向 GUI 的线程返回/发送一个数字。为此,我使用 BackGroundWorker 和 ReportProgress 。
让我们这样说:
我有一个 BackGroundWorker ,它执行 (DoWork) 一个从 0 计数到任何值的简单循环。循环的每个条目我使用 ReportProgress 事件将计数器发送到 GUI 线程,该线程将打印计数器的值。
void worker_DoWork(object sender, DoWorkEventArgs e)
{
int count = 0;
BackgroundWorker Worker = (BackgroundWorker)sender;
while (count < 10000000)
{
Worker.ReportProgress(count);
count++;
}
}
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
txt.Text = e.ProgressPercentage.ToString();
}
现在,这个选项冻结了 GUI。
我知道 ReportProgress 正在创建 BackGroundWorker 的线程上调用 ProgressChange 处理程序,因此我认为循环执行得如此之快,因此 GUI 的线程无法成功将值打印为必填。
如何在不冻结 GUI 的情况下执行这样的任务?
我听说过 Dispatcher,但我不确定它的用途。
【问题讨论】:
-
你的意思是 GUI 对吗?因为据我所知 GUID 是完全不同的东西 :-) 另外,您使用的是 WinForms 吗?或者我可以假设 WPF 吗?
-
GUI= 图形用户界面;GUID= 全球唯一标识符...仅供参考;)
标签: c# multithreading backgroundworker dispatcher