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?