线程如何更新主程序中的全局数据?

时间:2011-03-18 02:14:20

标签: .net vb.net multithreading threadpool

我正在重温an old thread of mine

我想启动一堆线程,每个线程执行相同的任务,并在每次完成时知道main(),如果它成功或失败。

提供的解决方案是使用ConcurrentQueue,但其他帖子建议使用BackgroundWorker Class或线程池。

有明确的答案吗?

同样,所有线程执行相同的代码并具有通过/失败结果。我希望运行的线程超过可用的线程,所以只要一个线程完成,我就会尽快启动另一个 - 我希望tehm尽可能地强调远程系统(reather而不是强调我的本地PC有太多的线程,所以我会需要进行实验以确定最佳线程数。)

VB .NET的具体答案,但也欢迎一般的线程建议。

4 个答案:

答案 0 :(得分:5)

BackgroundWorker是管理正在运行的线程的一种非常简单的方法。它允许您轻松地将进度报告回UI。我不认为有明确的答案,但BackgroundWorker是为此目的而设计的 - 运行后台任务,在UI进行时更新UI。这是an example of how to is it

答案 1 :(得分:1)

Josh是我的方式。

根据需要创建尽可能多的新后台工作者,挂钩拦截他们的“已完成”事件(我忘记确切的名称),当这些事件在主应用程序线程上重新启动时,将结果存储在集合/列表/中某些阵容。

如果你真的需要池线程,那么事情就会变得有趣,所以你不要创建大量线程,这会导致许多上下文颠簸。相反,你想拥有一个池,比如2x(机器中的处理器数量),并且当每个后台工作者完成时,排队另外一个任务。

答案 2 :(得分:1)

这取决于。在Windows窗体应用程序中,我会使用BackgroundWorker,因为它很容易设置和使用,这让我很难找到错误的交叉线程错误。

但是你必须意识到BackgroundWorker只能在有UI线程和消息循环的环境中正常工作。例如,它在控制台应用程序中不起作用。

在这种情况下,您应该使用其他解决方案,ThreadThreadPool或某种框架。

答案 3 :(得分:1)

我同意有关BackgroundWorker的建议。但是,如果需要从后台线程访问COM对象,请不要使用BackgroundWorker,而是创建自己的线程机制并根据需要使用MTA STA模型。