生成多个线程进行工作,然后等待所有线程完成。

53

我只是想请教一下关于多线程任务的“最佳实践”。 例如,我们有一个C#应用程序,在启动时从我们数据库中的各种“类型”表中读取数据,并将信息存储在一个集合中,我们在整个应用程序中传递该集合。这可以防止我们每次需要此信息时都访问数据库。

目前,该应用程序正在同步地从10个表中读取数据。 我真的很想让应用程序从每个表中以不同的线程读取所有表,并行运行。 应用程序将等待所有线程完成后才继续启动应用程序。

我已经研究了BackGroundWorker,但只是想请教如何实现上述内容的建议。

  1. 这种方法是否合乎逻辑,能加速应用程序的启动时间?
  2. 我们如何最好地处理所有线程,牢记每个线程的工作相互独立,我们只需要在所有线程完成后才能继续。

期待您的回答。


1
看看并行任务库,这将为您真正简化事情。 - TimothyP
你是指任务并行库(TPL)吗?我会调查一下。 - pharoc
1
TPL非常适合这个任务,但需要至少.NET 3.5sp1(如果安装Rx)或.NET 4 RC(内置框架)才能使用...您建议需要一个.NET 2解决方案。 - Reed Copsey
3
只是出于好奇,你尝试过这些解决方案之一并发现了性能提升吗?如果你读取的底层数据来自同一来源,那么将读取并行化可能根本没有任何好处,因为它们最终会相互等待资源访问。所有发生的事情只是额外的上下文切换开销。只有在满足以下两个条件时,多线程才真正有益于性能:a)实际拥有多个核心,b)受制于计算而不是共享资源的访问。 - Dan Bryant
1
如果这个问题有一个被接受的答案,尤其是考虑到为此贡献了时间的不同用户数量,那就太好了。 - demongolem
12个回答

0
如果您使用的是 .NET 3.5 或更低版本,则可以使用 AsyncResult 数组或 BackgroundWorker,并计算有多少个线程已返回(只需不要忘记使用交互式操作减少计数器)(请参见 http://www.albahari.com/threading/ 作为参考)。
如果您使用的是 .NET 4.0,那么并行 for 是最简单的方法。

@Kiquenet 目前我没有可使用的任何准备好的东西。我不确定这是否是请求完整代码示例的正确网站。 - Danny Varod

0
发布一下,或许能帮助其他人,我花了很多时间寻找类似于我想出的解决方案。所以我采用了一个稍微不同的方法。我正在启动多个线程并递增计数器,当线程启动和停止时递减计数器。然后在主方法中,我想暂停并等待线程完成。
while (threadCounter > 0)
{
    Thread.Sleep(500); //Make it pause for half second so that we don’t spin the cpu out of control.
}

在我的博客上有记录。 http://www.adamthings.com/post/2012/07/11/ensure-threads-have-finished-before-method-continues-in-c/


我无法使用Thread.Join()方法停止PageLoad完成,但使用一个简单的计数器,我可以循环直到所有线程都完成。 - Adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接