2010-04-19 110 views
2

我们有一个商业案例,将完美的多个BackgroundWorkers。产卵BackgroundWorkers

作为一个例子,我们有一个带有“保存”按钮的窗体。通常我们会同步运行所有的保存命令(Save是一个例子),然后关闭表单。我们现在想要使用backgroundworker将工作分解到单独的线程。

我们将遍历每个需要执行的“保存”(可能需要执行多个和/或不同数量的命令),以便为每个需要的命令创建一个BackgroundWorker。

问题是......我们如何等待所有BackgroundWorkers完成之后才能关闭表单。我们知道如何等待单个BackgroundWorker完成,但是当我们有多少个BackgroundWorkers在运行时,我们如何等到所有完成才能关闭UI表单?

回答

2

跟踪你已经开始,递减的Completed事件的数量,并关闭该窗体,当它到达0

由于Completed事件在UI线程上提出BackgroundWorkers的数量,你不”不必担心线程安全。

+0

这是一个好主意! – washtik 2010-04-19 00:41:12

0

我建议使用下面的(非常优异)MSDN杂志文章中介绍的CountdownLatch类:记住SLaks

9 Reusable Parallel Data Structures and Algorithms

轴承注意有关BackgroundWorker的UI线程上被提出Completed事件,此可能会矫枉过正。

+0

你不需要。 BackgroundWorker在UI线程上触发其“Completed”事件,因此线程安全不是问题。 – SLaks 2010-04-19 00:34:27

+0

以前从未使用BackgroundWorker,所以今天我学到了一些东西。这是否意味着它们只能用于Forms应用程序? – spender 2010-04-19 00:36:24

+0

否;它使用'SynchronizationContext'。 – SLaks 2010-04-19 00:49:51