2010-10-12 57 views
1

我有300个线程正在逐个执行。我使用连接,所以它是一个接一个。我想一次执行N个线程。在c中创建线程池#

任何人都可以指示我在c#中创建线程池的链接(带有N个线程)。我的情况是在N个线程执行的时候,剩下的线程将会等待。当一个线程完成执行时,一个等待线程将进入执行状态。

任何代码片段赞赏。非常感谢。

回答

2

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

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

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

+0

http://thejoyofcode.com/Tuning_the_ThreadPool.aspx – 2010-10-12 17:21:44

+0

http://msdn.microsoft.com/en-us/library/dd460720.aspx – 2010-10-12 17:22:05

+1

嘿,还有一件事 - 我刚拿到今天的MSDN Flash电子邮件,并且有一个免费的可下载的C#线程电子书 - http://www.albahari.com/threading/ – 2010-10-12 18:27:41

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 

最重要的部分是,你开始他们都开始加入之前,否则你会等待每个线程开始下之前完成,从而然后他们真的会是连续的。我想这就是你可能在做的事情?

+0

这里我的调用线程使用Join,所以它等待,直到创建的线程退出,然后产生新的线程。 – jaks 2010-10-12 16:55:47

+0

@Jai:是的,你必须先开始他们,然后开始加入。 – 2010-10-12 16:56:36

+0

如果我启动N个线程并加入它。它将等待,直到所有N个线程完成。但是我想要的是如果任何一个线程完成,必须产生一个新的工作(线程)。 – jaks 2010-10-12 17:03:09

2

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