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

4

我正在重新查看我的一个旧线程

我想启动一堆执行相同任务的线程,并且能够在main()中知道每个线程何时完成以及它是成功还是失败。

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

是否有明确的答案?

同样,所有线程执行相同的代码并具有通过/不通过的结果。我想运行更多线程,以便一旦一个线程完成,我就会尽快启动另一个线程 - 我希望他们尽可能地压力远程系统(而不是用太多线程来压力我的本地PC,因此我需要进行实验以确定最佳线程数)。

VB .NET用于特定答案,但也欢迎一般的线程建议。

4个回答

5

BackgroundWorker是管理运行线程的一种非常简单的方式。它使您可以轻松地向UI报告进度。我认为没有一个明确的答案,但BackgroundWorker是专门用于此目的 - 运行后台任务并在其进展时更新UI。这里是如何使用它的示例


我添加了更多信息的链接,但是在幕后它会启动一个线程来完成工作。 - Josh M.

1

我会选择Josh的方法。

根据需要创建尽可能多的新后台工作程序,连接到拦截它们的“完成”事件(我忘记了确切的名称),当这些事件在主应用程序线程上触发时,将结果存储在某种集合/列表/数组中。

如果您真的需要池化线程,以便不仅创建大量线程会导致很多上下文抖动,而是要有一个池,例如机器中处理器数量的2倍,并且每当后台工作程序完成时,在其位置上排队另一个任务。


1

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


1

这要看情况。在 Windows Forms 应用程序中,我会选择使用 BackgroundWorker,因为它非常容易设置和使用,并且可以避免我寻找不正确的跨线程错误。

但是你必须注意,BackgroundWorker 只能在存在 UI 线程和消息循环的环境中正常工作。例如,在控制台应用程序中它将无法工作。

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


+1 谢谢。性能至关重要,因此我需要一个快速的解决方案,即使以简单的解决方案为代价。你知道类层次结构吗?BackgroundWorker 是从 Thread 派生的吗? - Mawg says reinstate Monica

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