2016-10-26 8 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()メソッドは何らかの種類のデバイスを起動し、そのメソッド内でデバイスは2つの状態 "Starting"と "Ready"になります。状態が変化すると、クライアントはMyServiceCallbackクラスのNotificationAvailableによって通知されます。

注文の配信が設定されているにもかかわらず、通知利用可能なメソッドメッセージ が正しい順序で受信されないことがあるという問題があります(正しい順序は「開始」→「準備完了」ですがコールバックは「準備完了」> )。

これは通常、StartSomething()メソッドの最初の呼び出しで発生します。何らかの種類のスレッド競合状態のようです。私がConcurrencyMode = ConcurrencyMode.SingleをMyServiceCallbackに設定すると、問題は消えます。

この問題を解決する正しい方法は何ですか?

答えて

0

InstanceContextModeをシングルスレッドに変更したいと思いますか?

セッション、インスタンス化、および同時実行性の詳細here

同時実行性の使用は、インスタンス化モードに関連しています。 PerCall インスタンシングでは、各メッセージが新しいInstanceContextによって処理された であり、したがって1つ以上の スレッドがInstanceContextでアクティブであるため、並行性は関係ありません。

関連する問題