我在C#/ WPF(.Net框架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);
}
在主窗口类为:
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中实例化?即使是一个或两个指针也会很棒。
我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –