2012-08-10 37 views
2

我有一個3個耗時函數的序列,我想在後臺工作者或其他任何工具中執行它們,我的問題是每個函數都應該等待先驗函數完成,所以這是我的僞代碼:鏈中的多背景工作者

open_session() // during the execution of this function i like to display a loading-window 

open_session() //this function opens a process another windows app , while opening this app i would like to keep the current app responsive. 

close_session()// during the execution of this function i like to display a loading-window 

我想象使用後臺工作者來做到這一點,但功能是異步的。

任何幫助,請

回答

3

剛開始的前一個的RunWorkerCompleted事件處理每個連續的工人......

Adressing的downvotes:請注意,這是一個可能性。不管它是否是一個好選擇,顯然都取決於上下文,就像往常一樣。我不相信黃金法則,比如「僅僅使用一個BGW就更好」。我可以想象在很多情況下,對所有任務使用單個BW都不會簡化問題(例如,如果每個操作都需要以不同方式處理ProgressChanged)。

OP詢問了多個背景工作者,但沒有給出足夠的上下文來判斷什麼方法是最好的 - 就我所知,他可能只是理論上想知道如何「鏈接」BW,以獲得更好的理解BW的工作原理。

+1

爲什麼還要花費管理所有這些額外的線程/任務的開銷,如果你只是想同步它們。首先,最好只使用一個BGW。 – Servy 2012-08-10 21:09:30

+0

@Servy是什麼類型的開銷呢,真的嗎?它可能會使代碼更具可讀性,例如,如果使用'e.Result',並且每個任務完成後分配的結果是不同的類型。我已經看到代碼將所有異步的東西加入到一個大的DoWork事件處理器中;可能沒有經歷管理額外線程的開銷,但是膨脹並且更難以調試。 – 2012-08-10 21:53:23

+0

是啊我正在尋找你的解決方案,但我試圖避免玩BGW RunWorkerCompleted事件,有沒有辦法避免玩這個事件? – geogeek 2012-08-10 22:23:17

9

爲什麼不在相同的後臺工作者中按順序執行所有三個?所以,你的BackgroundWorker的工作情況是這樣的:

private void yourBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    open_session(); 
    open_session(); 
    close_session(); 
} 

這樣,BackgroundWorker的本身是異步的,但要連續運行的三種方法仍然是異步方法的範圍內按順序運行。

+0

爲什麼呢,這確實有一個downvote ..? – 2012-08-13 14:05:44