循环中的 C# WinForms 多线程

标签 c# multithreading

场景

我的应用程序中有一个后台工作程序运行并执行大量处理。我专门使用这个实现来保持我的用户界面流畅并防止它卡住。我想保留后台工作人员,但在该线程内,只产生 3 个线程 - 让它们共享处理(目前工作线程只是循环并逐个处理每个 Assets 。但是我想加快这个速度但只使用有限数量的线程。

问题

给出下面的代码,我怎样才能让循环选择一个空闲的线程,然后在没有空闲的线程继续之前基本上等待。

代码

        foreach (KeyValuePair<int, LiveAsset> kvp in laToHaganise)
        {

             Haganise h = new Haganise(kvp.Value,
                                      busDate,
                                      inputMktSet,
                                      outputMktSet, 
                                      prodType,
                                      noOfAssets, 
                                      bulkSaving);

             h.DoWork();

         }

想法

我猜我必须从创建 3 个新线程开始,但我担心的是,如果我每次都实例化一个新的 Haganise 对象——我如何才能将正确的“h”对象传递给正确的线程......

  Thread firstThread = new Thread(new ThreadStart(h.DoWork));
  Thread secondThread =new Thread(new ThreadStart(h.DoWork));
  Thread thirdThread = new Thread(new ThreadStart(h.DoWork));

非常感谢帮助。

最佳答案

根据线程必须完成的工作的大小,ThreadPool.QueueUserWorkItem可能是一个不错的选择。这将创建一个线程并将其放入队列中,并在池中有可用线程时执行它。

或者,您可以创建自己的池类型,它有 3 个线程并使用 ManualResetEvent确定特定线程何时完成。

关于循环中的 C# WinForms 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2605896/

相关文章:

c# - WCF CustomBinding 双工无法打开客户端端口

c# - 如何避免 Elasticsearch 中的常见术语

c# - Azure 搜索索引器清除文档

c++ - just::thread 和 poco::thread 或英特尔线程构建 block 之间的主要区别是什么

C#跨线程操作报错

c# - 页面方法和安全

c# - 如何在 ASP.NET Core 6.0 Web API 中读取 Azure App 服务的应用程序设置

python - CPU 为 100% 用于多处理队列以从多个摄像机获取帧

iphone - Lua 和一点多任务处理

Java如何同步2个线程?