我有300个线程正在逐个执行。我使用连接,所以它是一个接一个。我想一次执行N个线程。在c中创建线程池#
任何人都可以指示我在c#中创建线程池的链接(带有N个线程)。我的情况是在N个线程执行的时候,剩下的线程将会等待。当一个线程完成执行时,一个等待线程将进入执行状态。
任何代码片段赞赏。非常感谢。
我有300个线程正在逐个执行。我使用连接,所以它是一个接一个。我想一次执行N个线程。在c中创建线程池#
任何人都可以指示我在c#中创建线程池的链接(带有N个线程)。我的情况是在N个线程执行的时候,剩下的线程将会等待。当一个线程完成执行时,一个等待线程将进入执行状态。
任何代码片段赞赏。非常感谢。
我想你可能正在寻找ThreadPool.QueueUserWorkItem。使用线程池可减少线程创建和销毁的大量开销。您可以根据可用硬件调整线程(在我的评论中链接),或允许系统最好地管理最小/最大并发线程。如果这是一个Web应用程序,你可以在你的web.config设置此设置你的“N”线程号:
<system.web>
<processModel minWorkerThreads="50"/>
</system.web>
如果您使用的是.NET 4.0中,您还可以使用“Parallel.ForEach”这会自动将循环的每次迭代调度到线程池中的多个线程上。 (链接在我的评论)
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
最重要的部分是,你开始他们都开始加入之前,否则你会等待每个线程开始下之前完成,从而然后他们真的会是连续的。我想这就是你可能在做的事情?
如果你的大部分线程都在等待你应该看看System.Threading.ThreadPool类。它可能只是做你想要的。而且效率很高。
http://thejoyofcode.com/Tuning_the_ThreadPool.aspx – 2010-10-12 17:21:44
http://msdn.microsoft.com/en-us/library/dd460720.aspx – 2010-10-12 17:22:05
嘿,还有一件事 - 我刚拿到今天的MSDN Flash电子邮件,并且有一个免费的可下载的C#线程电子书 - http://www.albahari.com/threading/ – 2010-10-12 18:27:41