1

私のコードにはループがあり、このループ内でリモート Web サービスにいくつかのリクエストを送信します。WSプロバイダーは次のように述べています。

m 個のスレッドを送信する必要がある場合は、最初のn 個のスレッドがすぐに実行され、そのうちの 1 つが完了するとすぐに新しいスレッド (残りのmn個のスレッドの 1 つ) が実行され、 m 個のスレッドがすべて実行されるまで続きます。.

スレッド プール、最大スレッド数をnに明示的に設定することを考えました。これで十分ですか?

4

1 に答える 1

2

このため、複数のスレッドの使用は避けます。代わりに、単一のスレッドで実行できるループ全体をラップします。ただし、/a スレッド プールを使用して複数のスレッドを起動したい場合は、Semaphoreクラスを使用して必要なスレッド制限を容易にします。これが方法です...

セマフォは平均的なナイトクラブの用心棒のようなもので、クラブのキャパシティを提供しており、この制限を超えることはできません。クラブがいっぱいになると、他の人が入ることができなくなります... 外に列ができます。次に、ある人が去ると、別の人が入ることができます(J. Albahari のおかげで類推)。

値が 1のは、所有者を持たないためスレッドに依存しないことを除いて、 orSemaphoreと同等です。/を取得したスレッドのみがそれを解放できます。MutexLockSemaphoreReleaseSemaphoreMutexLockMutexLock

さて、あなたの場合、Semaphores を使用して同時実行を制限し、特定のコードを一度に実行するスレッドが多すぎるのを防ぐことができます。次の例では、5 つのスレッドが、3 人しか入室できないナイトクラブに入ろうとしています...

class BadAssClub
{
    static SemaphoreSlim sem = new SemaphoreSlim(3);
    static void Main()
    {
        for (int i = 1; i <= 5; i++) 
            new Thread(Enter).Start(i);
    }

    // Enfore only three threads running this method at once.
    static void Enter(int i)
    {
        try
        {
            Console.WriteLine(i + " wants to enter.");
            sem.Wait();
            Console.WriteLine(i + " is in!");
            Thread.Sleep(1000 * (int)i);
            Console.WriteLine(i + " is leaving...");
        }
        finally
        {
            sem.Release();
        }
    }
}

これが役立つことを願っています。


編集。ThreadPool.SetMaxThreadsメソッドを使用することもできます。このメソッドは、スレッド プールで実行できるスレッドの数を制限します。ただし、これはスレッドプール自体に対して「グローバル」に行われます。これは、アプリケーションが使用するライブラリで SQL クエリまたはその他のメソッドを実行している場合、このブロックが原因で新しいスレッドが起動されないことを意味します。これはあなたには関係ないかもしれません。その場合は、SetMaxThreadsメソッドを使用してください。ただし、特定のメソッドをブロックしたい場合は、 を使用する方が安全Semphoresです。

于 2013-08-19T09:54:29.017 に答える