2016-10-26 1 views
3

Ich habe ein Problem mit dem WCF-Duplex-Dienst.Nachrichten, die beim WCF-Rückruf empfangen werden, sind nicht in Betrieb

Das ist meine Service-Schnittstelle:

[DeliveryRequirements(RequireOrderedDelivery = true)] 
[(CallbackContract = typeof(IMyNotification), SessionMode = SessionMode.Required)] 
public interface IMyService 
{ 
    [OperationContract] 
    void StartSomething();  
    ... 
} 

Service-Implementierung:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class MyService : IMyService 
{ 
    ... 
} 

Callback-Schnittstelle:

[DeliveryRequirements(RequireOrderedDelivery = true)] 
public interface IMyNotification 
{ 
    [OperationContract (IsOneWay=true)] 
    void NotificationAvailable(Notification notification); 
} 

Client-Callback-Implementierung:

[CallbackBehavior (ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false)] 
class MyServiceCallback : IMyNotification 
{ 
    public void NotificationAvailable(Notification notification) 
    { 
      lock (_NotificationLock) 
      { 
       // process notification... 
      } 
    } 
} 

Lassen Sie uns sagen, dass StartSomething() -Methode eine Art des Geräts startet, und innerhalb dieser Methode geht Gerät aus zwei Zuständen "Start" und "Bereit". Wenn der Status geändert wird, wird der Client über NotificationAvailable in der MyServiceCallback-Klasse benachrichtigt.

Das Problem ist, dass manchmal in NotificationAvailable Methode Nachrichten nicht in der richtigen Reihenfolge empfangen werden, obwohl geordnete Lieferung festgelegt ist (Die richtige Reihenfolge wäre "Start" -> "Bereit" aber Rückruf empfängt "Bereit"> "Start").

Dies geschieht normalerweise beim ersten Aufruf der StartSomething() -Methode. Es scheint wie eine Art Thread Race Condition. Wenn ich ConcurrencyMode = ConcurrencyMode.Single auf MyServiceCallback einstelle, verschwindet das Problem.

Was ist der richtige Weg, um dieses Problem zu lösen?

Antwort

0

Ich wette, dass Sie diese InstanceContextMode zu Single-Thread ändern möchten.

Sessions, Instancing und Concurrency Details here.

Die Verwendung von Parallelität bezieht sich auf den Instanziierungsmodus. In PerCall Instancing ist Nebenläufigkeit nicht relevant, da jede Nachricht von einem neuen InstanceContext verarbeitet wird und daher nie mehr als ein Thread im InstanceContext aktiv ist.

Verwandte Themen