2017-03-10 7 views
1

Windows 10 IIS 1511上にWASサービスが設定されています。私は、私のアクチュアールプロジェクトを開始する前に、すべての主要な問題領域をソートするための簡単なテストアプリケーションを作成しました。私は、サービスを複数の同時実行性とインスタンスを単一性に設定しました。並行性を管理するための並行辞書があります。私はオブザーバー/サブジェクトを購読するために、2つの異なるプロキシオブジェクトを使用して2回サービスを呼び出します。 subscribeメソッドは、サブスクライバをディクショナリに追加します。 2回目のプロキシ呼び出しの後、辞書には1つの項目しかなく、私は2を期待していました。それで、私のサービスは私の変更を辞書に永続させていないようです。しかし、ちょうどカウンタ(値の種類)を増やすHello操作を使用すると、2回目の呼び出し後のカウントは2になります。ここに私のクライアントコンソールのコードは次のとおりです。ここでWCFサービスが永続しないリファレンスタイプのサービス

static void Main(string[] args) 
    { 
     string personErnie = "Ernie"; 
     string personAlvin = "James"; 

     //using (PersonTracker.PersonTrackerClient personTracker1 = 
     // new PersonTracker.PersonTrackerClient("PersonTrackerPipeEndPoint")) 
     //using (PersonTracker.PersonTrackerClient personTracker2 = 
     // new PersonTracker.PersonTrackerClient("PersonTrackerPipeEndPoint")) 
     using (PersonTracker.PersonTrackerClient personTracker1 = 
      new PersonTracker.PersonTrackerClient("PersonTrackerHTTPEndPoint")) 
     using (PersonTracker.PersonTrackerClient personTracker2 = 
       new PersonTracker.PersonTrackerClient("PersonTrackerHTTPEndPoint")) 
     { 

      string h1 = personTracker1.Hello(personErnie); //Output: Hello Ernie, Seems like you using the http protocol, count = 1 
      string h2 = personTracker1.Hello(personAlvin); //Output: Hello James, Seems like you using the http protocol, count = 2 

      PersonObserver personObserverErnie = new PersonObserver(personErnie); 
      object disposeObserverErnie = personTracker1.Subscribe(personObserverErnie); // Dictionary Count = 1 

      PersonObserver personObserverJames = new PersonObserver(personAlvin); 
      object disposeObserverJames = personTracker2.Subscribe(personObserverJames); // Dictionary Count = 1 
     } 
    } 

は私のサービスクラスである:ここで

[ServiceBehavior(
     ConcurrencyMode = ConcurrencyMode.Multiple, 
     InstanceContextMode =InstanceContextMode.Single)] 
public class PersonTracker : IPersonTracker 
{ 

    public static ConcurrentDictionary<string, PersonObserver> observers = null; 
    int Counter; 

    public string Hello(string name) 
    { 
     string protocol = OperationContext.Current.Channel.LocalAddress.Uri.Scheme; 
     return string.Format("Hello {0}, Seems like you using the {1} protocol, count = {2}",name, protocol,Counter++); 
    } 

    public UnsibscribePerson Subscribe(PersonObserver observer) 
    { 
     if (observers == null) 
     { 
      observers = new ConcurrentDictionary<string, PersonObserver>(); 
     } 
     if (!observers.ContainsKey(observer.Name)) 
     { 
      observers.AddOrUpdate(observer.Name, observer, (key, oldValue) => { return new PersonObserver(oldValue.Name); }); 
     } 

     return new UnsibscribePerson(observers, observer); 
    } 
} 

は私の契約インターフェイスです:

[ServiceContract(SessionMode = SessionMode.Required)] 
public interface IPersonTracker 
{ 
    [OperationContract] 
    string Hello(string name); 

    [OperationContract] 
    UnsibscribePerson Subscribe(PersonObserver observer); 
} 

退会クラスがためにIDisposableインターを拡張するクラスです。リモート(パイプ)がソートされると、クライアントは自分自身の登録を解除します。

質問:辞書は私が追加私のオブザーバーを持続しませんが、なぜそれがないカウンター...のための

UPDATE:だから

ちょうど私の購読操作の戻り値の型にUnsibscribePersonオブジェクトを除去することにより、私は問題を解決しましたが、私はこのオブジェクトを返す必要があります。ここでは、私のUnsibscribePersonオブジェクトに行うために、この何かが行われ、私の変更と私のUnsibscribePersonオブジェクトです:

[ServiceContract] 
public interface IPersonTracker 
{ 
    [OperationContract] 
    string Hello(string name); 

    [OperationContract(IsInitiating = true)] 
    void Subscribe(PersonObserver observer); 
} 

そして、ここでは私のUnsibscribePersonオブジェクトです:

[DataContract(IsReference = true)] 
public class UnsibscribePerson : IDisposable 
{ 
    [DataMember(EmitDefaultValue = false)] 
    private PersonObserver observer; 

    [DataMember(EmitDefaultValue = false)] 
    private ConcurrentDictionary<string, PersonObserver> persons; 

    public UnsibscribePerson(ConcurrentDictionary<string, PersonObserver> persons, PersonObserver observer) 
    { 
     this.persons = persons; 
     this.observer = observer; 
    } 

    public void Dispose() 
    { 
     if (observer != null && persons.ContainsKey(observer.Name)) 
     { 
      PersonObserver person = null; 

      persons.TryRemove(observer.Name, out person); 
     } 
    } 
} 

私も値に戻り値の型を変更しますタイプ(リストのカウントを返す)と私は結果を得た(1と2のカウント)。これは依然として参照型と値型に関連しているようです。

答えて

0

これは恥ずかしいです:) UnsibscribePersonクラスの私のDisposeメソッドは、それを添加した直後、私の加入者を除去する呼び出されます....

だから、私のためのソリューションはIDisposbaleインターフェイス

を実装していないことでした
関連する問題