【发布时间】:2013-12-18 04:43:36
【问题描述】:
我正在用 C#/WPF (.Net framework 4.0) 编写一个应用程序。我遇到的一件事是如何在应用程序非常繁忙时更新控件,如果可能的话。我想我只是在尝试我在网上找到的东西以使其工作(并且在极少数情况下确实如此)。 该应用程序有四个类,一个主窗口类、一个 Worker1 类和一个 Worker2 类以及一个静态 ExtensionMethods 类。 Worker2 从 Worker1 调用并完成大部分工作。当它运行时,CPU 为 100%(核心为 100%,系统有四个核心)。 (都在同一个命名空间中。)
public static class ExtensionMethods
{
private static Action EmptyDelegate = delegate() { };
public static void Refresh(this UIElement uiElement)
{
uiElement.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Render, EmptyDelegate);
}
}
主窗口调用 Worker1 中的顶级函数,该函数经过一些设置,然后开始漫长的过程,过程如下:
MainWindow mainWindow = App.Current.MainWindow as MainWindow;
mainWindow.dispatcher_UpdateProgressBarMaximum(maxValue);
int count=0;
Worker2 worker2 = new Worker2();
while (bytesRead =(readData() !=0) {
count++;
worker2.doWork();
mainWindow.dispatcher_UpdateProgressBar(count);
}
在mainWindow类中是:
dispatcher_UpdateProgressBar(int Value)
{
Dispatcher.BeginInvoke(new Action(() => myProgressBar.Value = value), null);
myProgressBar.Refresh();
}
(我也尝试过:myProgressBar.Dispatcher.Begin...等。
但两者都不重要。对于有 2 或 3 次读取的小文件,我可以看到进度条正在更新。但是对于大文件,直到最后都没有更新。 这也发生在我显示一些状态信息的一些标签控件上。完成整个工作后,我可以选择显示已完成工作的消息框。对于标签,当我显示消息框时,标签会更新。该应用程序可以一个接一个地处理许多文件。
我考虑过使用后台线程,但不知道该怎么做。也就是说,worker2.doWork() 部分非常密集,但如果它在它自己的线程上,则 mainWindow.dispatcher_Update... 将在线程开始后立即被调用,并且没有什么可以阻止下一次读取的发生,对吧?
也许按照我的编码方式是不可能的。如果我使用 Backgroundworker,该类会在主窗口或 Worker1 中实例化吗?即使是一两个指针也很棒。
【问题讨论】:
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
标签: c# wpf backgroundworker