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に設定すると、問題は消えます。
この問題を解決する正しい方法は何ですか?