【问题标题】:How should threads update global data in the main program?线程应该如何更新主程序中的全局数据?
【发布时间】:2011-03-18 02:14:19
【问题描述】:

我正在重访an old thread of mine

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

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

有确定的答案吗?

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

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

【问题讨论】:

    标签: .net vb.net multithreading threadpool


    【解决方案1】:

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

    【讨论】:

    • 我添加了指向更多信息的链接,但是是的,在幕后它正在启动一个线程来完成这项工作。
    【解决方案2】:

    乔希是我要走的路。

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

    如果您真的需要池化线程,事情会变得很有趣,这样您就不会只是创建大量线程,而这会导致大量上下文颠簸。相反,您希望拥有一个池,例如 2x(机器中的处理器数量),并且当每个后台工作人员完成时,将另一个任务排队。

    【讨论】:

      【解决方案3】:

      这取决于。在 Windows 窗体应用程序中,我会选择 BackgroundWorker,因为它非常易于设置和使用,而且它可以让我省去很多寻找不正确的跨线程错误的麻烦。

      但您必须知道BackgroundWorker 仅在存在 UI 线程和消息循环的环境中才能正常工作。所以它不能在控制台应用程序中工作,例如。

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

      【讨论】:

      • +1 谢谢。性能至关重要,因此我需要一个快速的解决方案,即使以牺牲一个简单的解决方案为代价。你知道类层次结构吗? backgroundworker 是从线程派生的吗?
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-05
        • 2013-03-14
        • 1970-01-01
        • 2020-11-29
        • 2013-12-19
        • 2017-02-25
        • 1970-01-01
        相关资源
        最近更新 更多