我在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/)」,其中的共識是「不,他們不應該」。 –