我有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