【发布时间】:2010-10-12 16:47:21
【问题描述】:
我有 300 个线程正在一个一个地执行。我使用join,所以它是一个接一个。我想一次执行 N 个线程。
任何人都可以将我指向在 c# 中创建线程池的链接(带有 N 个线程)。我的情况是一次 N 个线程将执行,其余线程将等待。当一个线程完成执行时,一个等待的线程将进入执行。
感谢任何代码 sn-p。非常感谢。
【问题讨论】:
标签: c# .net-3.5 threadpool
我有 300 个线程正在一个一个地执行。我使用join,所以它是一个接一个。我想一次执行 N 个线程。
任何人都可以将我指向在 c# 中创建线程池的链接(带有 N 个线程)。我的情况是一次 N 个线程将执行,其余线程将等待。当一个线程完成执行时,一个等待的线程将进入执行。
感谢任何代码 sn-p。非常感谢。
【问题讨论】:
标签: c# .net-3.5 threadpool
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
重要的部分是在开始加入之前将它们全部启动,否则您将等待每个线程完成后再开始下一个线程,因此它们实际上是顺序的。我猜这就是你正在做的事情?
【讨论】:
我想您可能正在寻找ThreadPool.QueueUserWorkItem。使用线程池可以减少线程创建和销毁的大量开销。您可以根据可用的硬件调整线程(我的 cmets 中的链接),或者允许系统最好地管理最小/最大同时线程。如果这是一个网络应用,你可以在你的 web.config 中设置它来设置你的“N”线程号:
<system.web>
<processModel minWorkerThreads="50"/>
</system.web>
如果您使用的是 .NET 4.0,您还可以使用“Parallel.ForEach”,它会自动将循环的每次迭代调度到线程池中的多个线程上。 (链接在我的 cmets 中)
【讨论】:
如果您的大部分线程都在等待,您应该查看 System.Threading.ThreadPool 类。它可能正是你想要的。而且效率很高。
【讨论】: