我有300个线程正在逐个执行。我使用join,所以它一个接一个。我想一次执行N个线程。
任何人都可以引导我到c#中创建线程池的链接(有N个线程)。我的情况是N个线程将执行,其余的线程将等待。当一个线程完成执行时,一个等待线程将进入执行状态。
感谢任何代码段。非常感谢。
答案 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”,它将自动将循环的每次迭代计划到线程池中的多个线程上。 (链接在我的评论中)