好的在這裏我的問題。我想開始線程,直到一定數量。讓我們說100.所以它將開始啓動線程並連續檢查正在運行的線程的數量。 當達到最大數量時,它將停止開始新線程。但有了適當的檢查間隔或完成的線程會發出信號,它會啓動新的線程。如何使一定數量的線程始終運行
用這種方法,我總是會有一定數量的正在運行的線程。
我管理這與睡眠和永久。所以我不斷檢查總運行線程數與給定的時間間隔,如果線程完成,處置它,並開始一個新的。
但我的解決方案並不是以正確的方式來到我身邊。我想如果完成的線程會發出信號,並且如果我們低於最大線程數閾值,檢查器將開始一個新的線程會更好。
我看到了很多線程池的例子,但其中大多數不包含任何排隊池和最大數量的正在運行的線程。我的意思是,他們只是開始線程,直到他們完成。但讓我們說,我有500k的收穫。我不能只是在帶有線程池的for循環中啓動它們。
平臺是c#4.5 WPF應用程序
下面是我的解決方案。其實我正在尋找一個更好的。沒有改善這一個。
private void Button_Click_4(object sender, RoutedEventArgs e)
{
Task.Factory.StartNew(() =>
{
startCrawler();
});
}
void startCrawler()
{
int irMaximumThreadcount = 100;
List<Task> lstStartedThreads = new List<Task>();
while (true)
{
for (int i = 0; i < lstStartedThreads.Count; i++)
{
if (lstStartedThreads[i].IsCompleted == true)
{
lstStartedThreads[i].Dispose();
lstStartedThreads.RemoveAt(i);
}
}
if (lstStartedThreads.Count < irMaximumThreadcount)
{
var vrTask = Task.Factory.StartNew(() =>
{
func_myTask();
});
lstStartedThreads.Add(vrTask);
}
System.Threading.Thread.Sleep(50);
}
}
void func_myTask()
{
}
「我不能只是在帶有線程池的for循環中啓動它們。」 - 你真的嘗試過嗎?假設它會使您的整體互聯網連接速度更快,開始多線程聽起來並不「合適」。另外Conisder使用異步操作 - 不需要那麼多的線程......除非你有類似32核心的機器...... – 2013-03-03 03:44:15