プロセスごとのリソースが1つしかないため、これを自動的に行う方法がわからないため、プロセスを手動で起動する必要があります。WCFを使用して、プロセス間通信を実行したり、すべてのプロセスに対して単一の公開エントリポイントを設定したりすることもできます。
リクエストを受け入れ、ワーカープロセスを起動し、データを送信して完了するのを待ってから、データを受信して元のリクエスターに転送する1つのスーパーバイザーサービスが必要です。各ワーカープロセスは、ServiceHost
クラスを使用してWCFサーバーをホストできます(非常に簡単に使用できます)。結果が返されたときにワーカープロセスを終了させるか、独自のプーリングを実行することができます。プールする場合は、ワーカーコントラクトに2つのメソッドがあります:DoWork
とShutdown
。各ワーカーのDoWorkをシリアルに呼び出すか、次の属性をワーカーサービスクラスに適用することで、WCF自体に同時リクエストをブロックさせることができます。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
ConcurrencyMode = ConcurrencyMode.Single)]
これにより、単一のワーカープロセスで2つの並列操作を実行しようとすると、リクエストがブロックされてキューに入れられます。そのため、ラウンドロビン方式ですべてのワーカースレッドを呼び出すだけで、ピーク負荷を超えて処理してキューに入れることができます。処理能力。
上司は、単純なクライアント向けの契約を結び、作業を労働者のプロセスに単純に任せます。ワーカーをプールしている場合は、負荷が減少して不要になったときに一部のワーカーをシャットダウンできます(必要な場合)。スーパーバイザーは、WCFの非同期パターンを使用して、各要求がスレッドをブロックして拘束する代わりに、実質的にリソースを使用しないようにすることができます(実際には何の作業も行わないため)。Task<T>
WCF非同期の場合、.NET 4.0以下でWCFに必要な非同期フープをジャンプするよりも、実装がはるかに簡単であるため(単に、を返す)、.NET4.5を使用することをお勧めします。
肝心なのは、あなたの奇妙な制約のために、あなたはあなたの望ましい目標を達成するために少し足の仕事をしなければならないということです。それでも、ほとんどの配管はWCFで処理できます。