2012-08-10 90 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