ここに私の質問があります。一定数までスレッドを開始したい。100としましょう。これにより、スレッドの開始が開始され、実行中のスレッドの数が継続的にチェックされます。最大数に達すると、新しいスレッドの開始を停止します。ただし、適切なチェック間隔または完了したスレッドを使用すると、シグナルが送信され、新しいスレッドが開始されます。
このようにして、私は常に特定の数のスレッドを実行します。
私はこれをsleepとpermanentwhileを使用して管理しました。だから私は与えられた間隔で実行中のスレッドの総数をチェックし続け、スレッドが完了したら、それを破棄して新しいスレッドを開始します。
しかし、私の解決策は適切な方法として私に来ていません。完了したスレッドがシグナルを送信し、スレッドの最大数のしきい値を下回っている場合は、チェッカーが新しいスレッドを開始する方がよいと思います。
多くのスレッドプールの例を見ましたが、それらのほとんどには、実行中のスレッドの最大数を含むキューに入れられたプールが含まれていません。私が言いたいのは、彼らは完了するまでスレッドを開始し続けるということです。しかし、私が収穫する500kのURLを持っているとしましょう。スレッドプールを使用して、それらすべてをforループで開始することはできません。
プラットフォームはc#4.5WPFアプリケーションです
そして、ここに私の解決策があります。実際、私はもっと良いものを探しています。これを改善していません。
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()
{
}