2013-09-25 44 views
3

我繼承了一個BackgroundWorker和被覆蓋的OnDoWork:BackgroundWorker的OnDoWork是否從調用線程或工作線程調用?

protected override void OnDoWork(DoWorkEventArgs e) 
{ 
    WorkerEndedEvent.Reset(); 
    base.OnDoWork(e); 
} 

我的問題是,該線程將這個被稱爲從?是否保證在我致電RunWorkerAsync()期間被調用,或者是否可以在之後調用(即從工作者線程)?

回答

3

它將由工作者線程調用,並且不保證在致電RunWorkerAsync期間被調用。

RunWorkerAsync狀態的文檔:

的方法的RunWorkerAsync提交給開始操作 異步運行的請求。當請求被服務時,引發DoWork事件 ,這反過來開始執行您的背景 操作。

因此RunWorkerAsync只提交請求開始操作 - 這將提高DoWork事件。它不保證什麼時候會調用DoWork

,也是documented爲使用一個單獨的線程爲它的工作:

在一個單獨的線程執行的操作。

很明顯DoWork被調用的線程不是RunWorkerAsync

+0

太好了,謝謝。僅僅是從經驗,還是你知道有文件的解釋(MSDN似乎沒有提到它!!)? – noelicus

+0

@noelicus它*具有*從一個單獨的線程調用 - 否則它不會是異步的! –

+0

@noelicus:[The documentation](http://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker.aspx)包含一個間接提示:*「您必須小心,不要操作任何用戶 - 接口對象的DoWork事件處理程序中,而是通過ProgressChanged和RunWorkerCompleted事件「*」與用戶界面進行通信。這意味着DoWork在不同於調用'RunWorkerAsync'的線程上執行,但'ProgressChanged'和'RunWorkerCompleted'被編組回調用線程。 –

相關問題