BackgroundWorker控制項

2022-02-02 12:10:38 字數 3450 閱讀 3552

在我們的程式中,經常會有一些耗時較長的運算,為了保證使用者體驗,不引起介面不響應,我們一般會採用多執行緒操作,讓耗時操作在後台完成,完成後再進行處理或給出提示,在執行中,也會時時去重新整理介面上的進度條等顯示,必要時還要控制後台執行緒中斷當前操作。

程式執行步驟:

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