使用執行緒新建WPF窗體 公用進度條窗體

2022-01-14 12:00:49 字數 2464 閱讀 1070

專案中需要乙個公用的進度條窗體.大家知道在wpf中,有兩個執行緒,乙個是ui執行緒,另乙個是監聽執行緒(一直監聽使用者的輸入).如果我們後台有阻塞ui執行緒的計算存在,那麼介面上的比如進度條什麼動態的ui都會被因為阻塞而靜止不動.

所以我的想法就是新起乙個執行緒來負責進度條窗體的顯示與關閉,具體實現**如下:

private

static

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...