通常的做法是在UI線程中顯示進度窗口(帶有進度條),並從工作線程更新進度。顯示進度條:相反方向
我有很多在GUI線程本身啓動並運行的長操作(它臨時凍結GUI)。要求是顯示所有現有長操作的進度條。通常的解決方案是將長操作作爲線程移動,並從那裏更新進度。但我不確定這些長期操作的線程安全性。
有沒有一種方法,我們在另一個線程(所以它不凍結)顯示進度窗口,然後從主GUI線程本身更新進度?
通常的做法是在UI線程中顯示進度窗口(帶有進度條),並從工作線程更新進度。顯示進度條:相反方向
我有很多在GUI線程本身啓動並運行的長操作(它臨時凍結GUI)。要求是顯示所有現有長操作的進度條。通常的解決方案是將長操作作爲線程移動,並從那裏更新進度。但我不確定這些長期操作的線程安全性。
有沒有一種方法,我們在另一個線程(所以它不凍結)顯示進度窗口,然後從主GUI線程本身更新進度?
我不知道解決方案在另一個線程中顯示ProgressBar,但您可以試着讓系統從您的長時間運行操作中執行其操作(更新UI)。對於這一點,你可以從你的長期運行的操作中反覆調用下面的函數:
public static void DoEvents() {
DispatcherFrame frame = new DispatcherFrame();
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new DispatcherOperationCallback(delegate(object parameter) {
frame.Continue = false;
return null;
}), null);
Dispatcher.PushFrame(frame);
}
,但照顧,這不是解決問題的好辦法。最好選擇一個合適的設計。
入住這thread
我認爲你應該使用Application.DoEvents()
這是winforms。 OP已經標記了它的問題,因爲WPF和WPF沒有Application.DoEvents。這就是我發佈替代功能的原因。但如上所述:這只是一個解決方法。 – HCL
「Application.DoEvents()」的使用是非常糟糕的做法,可能會導致諸如重新入侵等各種問題。 – Enigmativity
mmhmm所以我們應該怎麼做,如果我們想在線程的UI中移動進度條?順便說一句,我道歉我的答案,我認爲這是一個winform :) – spajce
我建議,這將是從長遠來看,更好地爲您重構你的長期運行的代碼出來的UI和進入單獨的類可以在不同的線程上運行。它會爲您節省很多的痛苦,並幫助您在將來編寫更好的代碼。 – Enigmativity
我也希望這樣做。但是,這些操作是由過去的其他人撰寫的,涉及文件,數據庫,UI控件和每個敏感的非線程安全事物。時間和精力不利於打擾現狀。 – Socrates
我會傾向於不同,但我相信你會對複雜性有比我更好的想法。我認爲,儘管如此,你在糟糕的情況下拋開了良好的開發人員時間,並使情況變得更糟。學習重構複雜的系統是一項你擅長練習的技巧。 – Enigmativity