わかりました...私はサイトを公正に検索し、このトピックに関する多くの投稿を読みました. 私はこの質問を見つけました: C# の単純なスレッド プールのコードは特に役に立ちます。
ただし、いつものように、必要なものは少し異なります。
私は MSDN の例を調べて、それを私のニーズに合わせて調整しました。私が参照する例はここにあります: http://msdn.microsoft.com/en-us/library/3dasc8as(VS.80,printer).aspx
私の問題はこれです。HttpWebRequest
とWebResponse
クラスを介して Web ページをロードし、 を介して結果を読み取るかなり単純なコード セットがありますStream
。このメソッドは何度も実行する必要があるため、スレッドで起動します。メソッド自体はかなり短いですが、(毎回さまざまなデータで) 起動する必要がある回数はさまざまです。1 から 200 までの任意の値を指定できます。
私が読んだものはすべて、ThreadPool
クラスが最有力候補であることを示しているようです。これがトリッキーになるものです。これを 100 回実行する必要があるかもしれませんが、(この特定のタスクの場合) 実行できるスレッドは最大で 3 つだけです。
ビアに設定してみましMaxThreads
た:ThreadPool
ThreadPool.SetMaxThreads(3, 3);
私は、このアプローチが機能していると完全に確信しているわけではありません。さらに、これが実行されるシステムで実行されている他の Web サイトやプログラムを破壊したくありません。上のスレッドの数を制限することでThreadPool
、これが自分のコードと自分のスレッドのみに関連していると確信できますか?
MSDN の例では、イベント ドライブのアプローチと呼び出しWaitHandle.WaitAll(doneEvents);
を使用しています。これが私が行っている方法です。
したがって、私の質問の核心は、コードで実行できるスレッドの最大数をどのように保証または指定するのですか?ただし、前のスレッドが任意の時点まで終了するときに、コードはより多くのスレッドを実行し続けますか? 私はこれに正しい方法で取り組んでいますか?
心から、
ジェイソン
さて、セマフォ アプローチを追加し、ThreadPool
コードを完全に削除しました。それは十分に単純に思えます。http://www.albahari.com/threading/part2.aspxから情報を入手しました。
方法を示したのは次の例です。
[以下のテキストは、サイトからのコピー/貼り付けです]
容量が 1のは、またはにSemaphore
似ていますが、には「所有者」がなく、スレッドに依存しません。どのスレッドでも を呼び出すことができますが、と を使用すると、リソースを取得したスレッドだけがリソースを解放できます。Mutex
lock
Semaphore
Release
Semaphore
Mutex
lock
次の例では、10 個のスレッドがループを実行Sleep
し、途中にステートメントがあります。Aは、一度にSemaphore
そのステートメントを実行できるスレッドが 3 つまでであることを保証します。Sleep
class SemaphoreTest
{
static Semaphore s = new Semaphore(3, 3); // Available=3; Capacity=3
static void Main()
{
for (int i = 0; i < 10; i++)
new Thread(Go).Start();
}
static void Go()
{
while (true)
{
s.WaitOne();
Thread.Sleep(100); // Only 3 threads can get here at once
s.Release();
}
}
}