2010-11-29 8 views
1

データを読み取るだけのインターフェイスを持つWCFサービスがあります。ただし、データベースからデータをリロードして一部の辞書を再初期化するインターフェイスが1つあります。このインターフェース「リロード」を実行している間、私は効果的に(私は、呼び出しごとの使用していたように)彼らは未知の状態のデータを読み込むと同じように、他のすべての呼び出しはWCF:1つの特定のインターフェイスが呼び出されているときにすべての呼び出しを待機させます。

[ServiceContract] 
public interface IMyObject 
{ 
    [OperationContract] 
    string Reload(); 
    [OperationContract] 
    string Read1(); 
    [OperationContract] 
    string Read2(); 
} 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
class MyObject : IMyObject 
{ 
    public string Reload() { //Takes 5-10secs, called twice a day } 
    public string Read1() { //Wait for Reload() to finish if it's running} 
    public string Read2() { //Wait for Reload() to finish if it's running} 
} 

は、このことは可能です「hold」に置くことにしたいですWCF?または、この問題を回避するための最良の方法がありますか?

答えて

1

私はあなたがConcurrencyModeで遊んでいれば、あなたが望むものを達成することができると思っています。

私はあなたがサービスに旗を掲げたいと思っていたことを達成しました。静的フラグを設定した場合、他の呼び出しでそのフラグがチェックされ、実行したいことを実行できます

1

はあなたに提案する:InstanceContextMode.Singleへ

  1. 変更InstanceContextMode.PerCall
  2. その後、あなたのMyObjectに実装でConcurrencyMode = ConcurrencyMode.Multiple(時間以上1つの実行を許可します)
  3. を追加します並行処理を手動で処理します。簡略lockまたは先進のメカニックを使用してください(ReaderWriterLockSlimなど)。

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)] 
    class MyObject: IMyObject 
    { 
        private readonly object lockObject = new object(); 
        public string Reload() 
        { 
         lock (lockObject) 
         { 
          // Reload stuff 
         } 
        } 
        public string Read1() 
        { 
         lock (lockObject) 
         { 
          // Read1 stuff 
         } 
        } 
    
        public string Read2() 
        { 
         lock (lockObject) 
         { 
          // Read2 stuff 
         } 
        } 
    } 
    

    欠点を、あなたがリード1とREAD2同時に呼び出すことができないことを、次のようにロック付き

実装です。この機能が必要な場合は、ロックの代わりにReaderWriterLockSlimを使用してください。

関連する問題