マルチスレッドについてアドバイスが必要です。
例: 200 個のスレッドを生成したいのですが、それぞれが Web サイトから 1 つの異なる画像を取得する必要があります (サイトは少し遅いです)。しかし、最大があるはずです。一度に 40 スレッド。
何か案が?
いくつかの答えを楽しみにしています。
マルチスレッドについてアドバイスが必要です。
例: 200 個のスレッドを生成したいのですが、それぞれが Web サイトから 1 つの異なる画像を取得する必要があります (サイトは少し遅いです)。しかし、最大があるはずです。一度に 40 スレッド。
何か案が?
いくつかの答えを楽しみにしています。
これには簡単に使用できますThreadPool
。プールはスレッドをうまく管理しますが、本当に使用できる最大数を制限する必要がある場合は、次のようにします。
ThreadPool.SetMaxThreads(40, 40);
// submit 200 tasks to the pool
for(int i = 0; i < 200; i++)
{
ThreadPool.QueueUserWorkItem(
() =>
{
// code for each task
});
}
残念ながら、タスクが終了するのを待つ組み込みの方法はないので、何かを即興で演奏する必要があります。.NET 4.0にアクセスできる場合は、以下を確認できますParallel.For
。
ParallelOptions po = new ParallelOptions();
po.MaxDegreeOfParallelism = 40;
Parallel.For(0, 200, po,
i =>
{
// code for each task
});
必要なすべての URL で満たされたスレッドセーフなキューを使用します。
そのキューから次のアイテムを取得し、URL からダウンロードすることをジョブとする 40 個のスレッドを作成します。キューが空になると、スレッドは終了するはずです。
試す
SlimSemaphore slm=new SlimSemaphore(40);
slm.Wait()
[your code]
slm.Release();
これにより、一度に実行できるスレッドは40個のみになります。
注:SlimSemaphore(.Net Framework 4.0を使用している場合)それ以外の場合はSemaphore
only efficiency difference is there
作成して Parallel.ForEach ループに提供する ParallelOptions オブジェクトを使用して、MaxDegreeParallelism を設定できます。後で適切なキーボードの背後にいるときに、いくつかのコードを貼り付けます。