在c#中创建一个线程池

时间:2010-10-12 16:47:22

标签: c# .net-3.5 threadpool

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

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

感谢任何代码段。非常感谢。

3 个答案:

答案 0 :(得分:3)

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

重要的是你在开始加入之前就开始了所有这些,否则你将等待每个线程在开始下一个之前完成,因此它们确实是顺序的。我想这就是你在做什么的?

答案 1 :(得分:2)

如果你的大多数线程都在等待,你应该看一下System.Threading.ThreadPool类。它可能只是做你想要的。它很有效率。

答案 2 :(得分:2)

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

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

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