WCF雙工服務出現問題。在WCF回調上收到的消息出現故障
這是我的服務接口:
[DeliveryRequirements(RequireOrderedDelivery = true)]
[(CallbackContract = typeof(IMyNotification), SessionMode = SessionMode.Required)]
public interface IMyService
{
[OperationContract]
void StartSomething();
...
}
服務實現:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class MyService : IMyService
{
...
}
回調接口:
[DeliveryRequirements(RequireOrderedDelivery = true)]
public interface IMyNotification
{
[OperationContract (IsOneWay=true)]
void NotificationAvailable(Notification notification);
}
客戶端回調實現:
[CallbackBehavior (ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false)]
class MyServiceCallback : IMyNotification
{
public void NotificationAvailable(Notification notification)
{
lock (_NotificationLock)
{
// process notification...
}
}
}
可以說,StartSomething()方法啓動某種設備,並且在該方法設備中從「啓動」和「就緒」兩個狀態開始。當通過MyServiceCallback類中的NotificationAvailable通知狀態更改客戶端時。
問題是,即使設置了有序傳送,正確的順序將是「正在啓動」 - >「就緒」,但回調接收到「準備就緒」>「正在啓動」,但有時在NotificationAvailable方法消息 未按正確順序接收)。
這通常發生在首次調用StartSomething()方法時。這似乎是某種線程競爭條件。當我在MyServiceCallback上設置ConcurrencyMode = ConcurrencyMode.Single時,問題消失。
解決此問題的正確方法是什麼?