專案中需要乙個公用的進度條窗體.大家知道在wpf中,有兩個執行緒,乙個是ui執行緒,另乙個是監聽執行緒(一直監聽使用者的輸入).如果我們後台有阻塞ui執行緒的計算存在,那麼介面上的比如進度條什麼動態的ui都會被因為阻塞而靜止不動.
所以我的想法就是新起乙個執行緒來負責進度條窗體的顯示與關閉,具體實現**如下:
privatestatic
thread th;
//////
顯示進度條 執行緒
/// ///
進度條介面需要顯示的文字
///增加進度條存在的延遲時間,單位為毫秒
public
static
void beginprogressbar(string msg, int
sleep)
));th.setapartmentstate(apartmentstate.sta);
th.isbackground = true
; }
if (th.threadstate != threadstate.background || th.threadstate == threadstate.unstarted || th.threadstate !=threadstate.running)
}catch
(exception)
));th.setapartmentstate(apartmentstate.sta);
th.isbackground = true
; th.start();
}thread.sleep(sleep);
}//////
結束進度條
/// public
static
void
endprogressbar()
呵呵,大家仔細分析下**看有什麼問題沒有?而你們又有什麼好的解決方案沒有?
在使用過程中發現乙個很嚴重的問題,出現乙個進度條窗體,系統記憶體就會增大一點,到最後要麼卡死,要麼自動退出.
中途停止乙個執行緒的執行,通常用thread.abort方法,但這種方式會造成程式涉及的資料完整性受到破壞,執行緒所占用的一些系統資源(比如檔案控制代碼等)也可能無法完成。比較合理的方式是外界提出"取消操作"的請求,然後由執行緒自身來決定如何處理這一請求。
所以對上述**進行了改進
首先設定乙個公共變數:
public static bool isclsoeprogeressbar = true;
然後在進度條窗體中實時讀這個資料
//// 的互動邏輯
/// public
partial
class
winprogressbar : window
dispatchertimer timer;
public
winprogressbar()
;}
void timer_tick(object
sender, eventargs e)
}else}}
}
然後在系統載入的時候,建立這個進度條窗體
try)); th.setapartmentstate(apartmentstate.sta);
th.isbackground = true
; th.start();
}catch
(exception)
我們只需改變公共變數來控制窗體的顯示與隱藏
//////顯示進度條 執行緒
///
public
static
void beginprogressbar()
//////
結束進度條
/// public
static
void
endprogressbar()
還有乙個比較好的方法:
#region methods//////乙個耗時的任務
/// private
void
bigtask()
private
void button1_click(object
sender, routedeventargs e)
private
void
myprogressbar(action mywork)
;worker.runworkercompleted += (s, e2) =>;
worker.runworkerasync();
window.show();
}#endregion
使用執行緒新建WPF窗體 公用進度條窗體
專案中需要乙個公用的進度條窗體.大家知道在wpf中,有兩個執行緒,乙個是ui執行緒,另乙個是監聽執行緒 一直監聽使用者的輸入 如果我們後台有阻塞ui執行緒的計算存在,那麼介面上的比如進度條什麼動態的ui都會被因為阻塞而靜止不動.所以我的想法就是新起乙個執行緒來負責進度條窗體的顯示與關閉,具體實現 如...
wpf執行緒進度控制
先上原始碼 namespace touchpy.loading region 載入loading控制項 載入loading控制項 public void loadingstart endregion region 執行緒載入函式 private void loading endregion regi...
WPF 窗體呼叫類中線程(實時)
最近需要做乙個窗體中實時呼叫類中的乙個執行緒問題,在網上找了很多都不符合需求,終於搞定這個問題,mark一下要不然時間久了就忘記了 mainwindow class1 oid newclass1 public mainwindow initializecomponent oid.show c sho...