2010-10-12 84 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類。它可能只是做你想要的。而且效率很高。