1

要求引数に基づいて最大並列度 1 を適用する WCF 呼び出しを取得するクリーンな方法はありますか?

次のコードを想定します。

 public void MyWcfOperation(int entityId, other arguments)
 {
      //do stuff with entity with id = entityId
 }

ここでは、entityId に基づいて最大 1 つの並列呼び出しを処理したいと考えています。WCF の同時実行オプションを設定できることはわかっていますが、これは同時実行またはシングル スレッドのいずれかです。しかし、entityId ごとに単一の呼び出しが必要な場合に、操作全体に対して単一の呼び出しに設定するのは少し極端すぎるようです。

私はこれをハンドロールする必要があると思いますが、アクター モデル ライブラリを使用しない場合、ここで最善の策は何でしょうか?

4

1 に答える 1

1

まず、ID に基づいて同期する必要があるかどうかを検討します。そうでなければ、スケールアップの問題を予見していますか? いつものように、時期尚早の可能性があるこの最適化を求める前に、テストとベンチマークを行うことが最善の選択肢です。

とはいえ、エンティティ ID の量が多くない場合は、次の簡単なソリューションを使用できます。

[ServiceBehavior(
   InstanceContextMode = InstanceContextMode.Single, // required to hold the dictionary through calls
   ConcurrencyMode = ConcurrencyMode.Multiple] // let WCF run all the calls concurrently
class Service
{
  private readonly ConcurrentDictionary<int, object> _locks = new ConcurrentDictionary<int, object>();

  public void MyWcfOperation(int entityId, other arguments)
  {
     lock (_locks.GetOrAdd(entityId, i => new Object())
     {
       // do stuff with entity with id = entityId
     }
  }
}

これはクリーンアップを処理しないため、多数のエンティティがある場合、ディクショナリは各エンティティのロック オブジェクトを含むように大きくなります。

于 2014-02-19T09:15:13.423 に答える