1

重複の可能性:
一度にメソッドを実行するスレッドの数を制限する

1つのアプリでは、コードのセクションの実行を4スレッドに制限する必要があります。このセクションはスレッドの開始/終了ではなく、スレッド内のコードのセクションです。

1つでこれを行う方法は簡単です-EventWaitHandleを作成し、それに待機/シグナルを送信します。しかし、私が4を実行することを考えたすべての方法で、待機する必要があると判断する可能性が残ります。別のスレッドがセクションとシグナルを存在させ、それから私は永遠に待機します。

では、すべてのスレッドが1つのアプリにある場合に、これを行うための最も軽量な方法は何でしょうか。

背景:ライセンスモデルを変更して、最大N個(この例では4個)のスレッドがライブラリを連続して呼び出すことができるようにします。私たちはサーバーではなくライブラリであるため、スレッドの使用を制御しません(データベースのように)。Webアプリの場合、呼び出し元のアプリもスレッドの数を制御しないため、最初の4つがそのコードを終了するまでスレッド5の呼び出しを一時停止する必要があります。

4

2 に答える 2

3

Semaphoreは、あなたにぴったりのスレッドプリミティブです。指定された数の同時ユーザーを許可します。追加のユーザーがブロックします。

private static Semaphore _semaphore = new Semaphore(4, 4);

次に、共有したいコードについて:

_semaphore.WaitOne();
try
{
    // protected code goes here
}
finally
{
    _semaphore.Release();
}

オーバーヘッドの点でこれが優れている点は、それWaitOneが効率的であることです。スレッドを適切にブロックし、誰かがRelease.

于 2012-11-04T00:34:14.143 に答える
0

romkynsが述べたように、セマフォを使用します。ただし、セマフォの下での操作は非常に大きくなるはずです。オーバーヘッドは相当なものです。SemaphoreSlimが自分のケースに適しているかどうかを検討してください (つまり、ライセンスが単一のプロセスのみに適用される場合は、Semaphore と SemaphoreSlim のどちらを選択すればよいですか?およびMSDNを参照してください)。

トピック外のコメント:

これは非常に不便なライセンス方式のようです。これを行うことで何を達成したいですか?ライセンス方式はビジネス価値を反映する必要があり、同時スレッド数について話すことは経営陣に伝えるのが難しいようです。次に、このライセンス スキームは、追加のライセンスの必要性を伝えるのにどのように役立ちますか? スレッド数に基づいてライセンスを設定すると、使用状況を監視するのが難しくなり、ユーザーに追加のライセンスの必要性を正当化することが難しくなります。

于 2012-11-04T00:39:50.413 に答える