2016-10-26 47 views
3

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時,問題消失。

解決此問題的正確方法是什麼?

回答

0

我敢打賭,你想將InstanceContextMode更改爲單線程。

會話,實例化和併發詳細信息here

併發性的使用與實例化模式有關。在PerCall 實例中,併發性並不相關,因爲每個消息都是由一個新的InstanceContext處理的 ,因此在InstanceContext中不會有多於一個的 線程處於活動狀態。