在我們的程式中,經常會有一些耗時較長的運算,為了保證使用者體驗,不引起介面不響應,我們一般會採用多執行緒操作,讓耗時操作在後台完成,完成後再進行處理或給出提示,在執行中,也會時時去重新整理介面上的進度條等顯示,必要時還要控制後台執行緒中斷當前操作。
程式執行步驟:
1、呼叫backgroundworker的runworkerasync()方法,如果後台操作需要引數,在呼叫runworkerasync()方法時給出引數,在dowork事件處理程式內部,可以從doworkeventargs.argument屬性中提取該引數。
2、執行dowork事件,後台需要執行的**放到dowork事件裡面執行。當呼叫runworkerasync()方法時,backgroundworker通過觸發dowork事件,開始執行後台操作
顯示後台操作進度:
為了顯示後台操作的執行進度,首先要使workerreportsprogress等於true,然後呼叫backgroundworker的reportprogress()方法,通過它傳遞操作完成的進度值,此外,該方法觸發progresschanged事件,在此事件中,通過progresschangedeventargs的例項,接收到主線程傳遞過來的引數。
取消後台操作:
為了使 backgroundworker 可以取消後台正在執行的操作,首先要把屬性workersupportscancellation 的值設定為 true。接著呼叫cancelasync()方法,該方法使得屬性cancellationpending 為true,利用cancellationpending 屬性,可以判斷是否取消後台非同步操作。
後台操作完成後,反饋給使用者:
當後台操作完成以後,無論是completed 還是cancelled,runworkercompleted()事件都會被觸發,通過此方法可以將後台操作的完成結果反饋給使用者。runworkercompleted 事件處理函式會在dowork 事件處理函式返回後被呼叫。通過它我們可以進行一些運算結束後的操作,比如禁用取消按鈕,異常處理,結果顯示等。注意,如果想要拿到e.result,您需要在bgworker_dowork方法中設定 e.result屬性另外,通過runworkercompletedeventargs例項的cancelled 屬性,以判斷是否是cancel操作使得後台操作終止;
從後台操作返回值
在執行dowork事件時doworkeventargs例項的result屬性,返回值到使用者;在runworkercompleted事件裡,runworkercompletedeventargs 例項的result屬性接收值;
建立backgroundworkerdemo例子:
1.新建乙個windows窗體應用程式,如:backgroundworkerdemo
2.拖乙個progressbar(進度條)和乙個backgroundworker控制項到form窗體上,介面如圖:
後台**:
using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.linq;
using system.text;
using system.threading.tasks;
using system.windows.forms;
using system.io;
using system.threading;
namespace backgroundworkerdemo
///
/// 開始
///
///
///
private void btn_start_click(object sender, eventargs e)
btn_start.enabled = false;
int count = convert.toint32(this.txt_file.text.tostring().trim());
//設定進度條
this.probar.minimum = 0;
this.probar.maximum = count;
this.probar.value = this.probar.minimum;
//開始執行非同步執行緒,進行後台操作,給後台傳遞引數
this.bgwork.runworkerasync(count);
}///
/// 後台操作要處理的任務**
///
///
///
private void bgwork_dowork(object sender, doworkeventargs e)}}
catch (exception ex)
finally
//判斷是否取消了後台操作
if (bgwork.cancellationpending)
//設定返回值
e.result = 234;}}
///
/// 更新前台介面進度條
///
///
///
private void bgwork_progresschanged(object sender, progresschangedeventargs e)
個檔案", val);
//進度條顯示當前進度
this.probar.value = val;
}///
/// 後台操作完成,向前臺反饋資訊
///
///
///
private void bgwork_runworkercompleted(object sender, runworkercompletedeventargs e)
else
}///
/// 取消
///
///
///
private void btn_cancle_click(object sender, eventargs e)}}
執行介面:
操作完成介面:
接收返回值:
取消後台操作:
BackgroundWorker控制項使用方法
在使用之前先了解一些知識。1 backgroundworker 作用 主要用在單獨的執行緒上執行操作。backgroundworker ui 似乎處於停止響應狀態。如果您需要能進行響應的使用者介面,而且面臨與這類操作相關的長時間延遲,則可以使用 backgroundworker類方便地解決問題。2 ...
多執行緒 BackgroundWorker
backgroundworker 事件有三個 dowork 呼叫 runworkerasync 方法時引發 progresschanged 呼叫 reportprogress 方法時引發 runworkercompleted 當後台操作已完成 被取消或引發異常時引發 1 backgroundwork...
BackgroundWorker實現非同步
private void button1 click object sender,eventargs e private void backgroundworker1 dowork object sender,doworkeventargs e this.backgroundworker1.repo...