【问题标题】:Creating a thread pooling in c#在 C# 中创建线程池
【发布时间】:2010-10-12 16:47:21
【问题描述】:

我有 300 个线程正在一个一个地执行。我使用join,所以它是一个接一个。我想一次执行 N 个线程。

任何人都可以将我指向在 c# 中创建线程池的链接(带有 N 个线程)。我的情况是一次 N 个线程将执行,其余线程将等待。当一个线程完成执行时,一个等待的线程将进入执行。

感谢任何代码 sn-p。非常感谢。

【问题讨论】:

    标签: c# .net-3.5 threadpool


    【解决方案1】:

    Join 并不规定线程是按顺序运行的——它只是让当前线程等待指定线程完成后再继续。

    因此,如果您启动 300 个线程,然后将它们全部连接起来,则 300 个线程将并行运行,并且一旦 300 个线程完成,连接线程就会完成。

    const int COUNT = 300;
    
    // create and start the threads
    var threads = new Thread[COUNT];
    for (int index = 0; index < COUNT; index += 1)
    {
        threads[index] = new Thread(...);
        threads[index].Start();
    }
    
    // now they're running, join them all
    for (int index = 0; index < COUNT; index += 1)
    {
        threads[index].Join();
    }
    
    // we're done
    

    重要的部分是在开始加入之前将它们全部启动,否则您将等待每个线程完成后再开始下一个线程,因此它们实际上是顺序的。我猜这就是你正在做的事情?

    【讨论】:

    • 这里我的调用线程使用Join,所以它等到创建的线程退出,然后产生新线程。
    • @Jai:是的,你必须先启动它们,然后再开始加入。
    • 如果我启动 N 个线程并加入它。它将等待,直到所有 N 个线程都完成。但我想要的是,如果任何一个线程完成,就必须产生一个新的工作(线程)。
    • @Jai:那么您就不能让线程本身在它们完成之前生成新作业吗?或者,更好的是,将这项工作作为他们现有工作量的一部分?
    【解决方案2】:

    我想您可能正在寻找ThreadPool.QueueUserWorkItem。使用线程池可以减少线程创建和销毁的大量开销。您可以根据可用的硬件调整线程(我的 cmets 中的链接),或者允许系统最好地管理最小/最大同时线程。如果这是一个网络应用,你可以在你的 web.config 中设置它来设置你的“N”线程号:

       <system.web>
            <processModel minWorkerThreads="50"/>
       </system.web>
    

    如果您使用的是 .NET 4.0,您还可以使用“Parallel.ForEach”,它会自动将循环的每次迭代调度到线程池中的多个线程上。 (链接在我的 cmets 中)

    【讨论】:

    • 嘿,还有一件事 - 我刚收到今天的 MSDN Flash 电子邮件,还有一本关于 C# 线程的免费可下载电子书 -- albahari.com/threading
    【解决方案3】:

    如果您的大部分线程都在等待,您应该查看 System.Threading.ThreadPool 类。它可能正是你想要的。而且效率很高。

    【讨论】:

      猜你喜欢
      • 2013-10-30
      • 2023-02-02
      • 1970-01-01
      • 2012-06-06
      • 2017-06-26
      • 1970-01-01
      • 1970-01-01
      • 2020-01-06
      • 1970-01-01
      相关资源
      最近更新 更多