2011年9月8日 星期四

C# Background Worker介紹

Background worker:一個簡單、好用的Thread方案
它可以以很簡單的方法產生工作執行緒,並且保持主執行緒的可用性,並且也支援回報狀態與交換資料能力,更方便的是他在處理跨執行緒使用UI介面的部分,大多時候可以不用透過Delegate、Invoke、WaitCallBack......等等複雜的觀念與機制,因為他已經幫你實作掉了。




寫法:可以由工具箱當中直接拉Background worker的控制項到Form上面,這樣也可以直接雙擊IDE介面來產生事件Method。


或是也可以自己宣告來產生實體,自己設定Event物件與Event Method。








Method:
RunWorkerAsync(object)
呼叫此函式,會讓Background worker以多執行緒的方式來執行DoWork()內的程式




DoWork(object sender, DoWorkEventArgs e)
將你想執行的耗時的程式片段寫在其中,在呼叫Background worker的RunWorkeAsync()時,就會以多執行緒的方式執行此函式。注意,在這個函式中,可以執行任何跟UI有關的動作,不允許跨執行緒存取UI。




RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
當DoWork()被執行完成之後,會自動呼叫這個函式,如果預期完成之後要做什麼動作,可以寫在這個函式裡。這個函式可以存取Main Thread的UI,不會有誇執行緒的問題。或者說,除非寫法上有多執行緒的特殊用法,否則一般來說這個函式會在Main Thread執行,也因此才不會有跨執行緒存取UI的問題產生。





ProgressChanged(object sender, ProgressChangedEventArgs e)
Background worker提供了一個ReportProgress()的函式,可以隨時對這個背景執行的工作定義完成進度,而通常,想當然爾,這個函式,會在DoWrok裡呼叫,依照做的進度,來呼叫函式傳給Background worker,而當你呼叫了ReportProgress()之後,就會立刻一併觸發ProgressChanged()。而這個函式可以存取Main Thread的UI,不會有誇執行緒的問題。或者說,除非寫法上有多執行緒的特殊用法,否則一般來說這個函式會在Main Thread執行,也因此才不會有跨執行緒存取UI的問題產生。 也就是說,一般我們會把需要變更UI的程式寫在這裡,而不會寫在DoWork(),當DoWrok()當中的,需要對UI有什麼控制時,就以回報進度的方式,在ProgressChanged()裡頭來做。

沒有留言:

張貼留言