WCF回调收到的消息顺序混乱。

3
我有一个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时,问题消失了。
解决此问题的正确方法是什么?
1个回答

0

我敢打赌你想把那个InstanceContextMode改成单线程。

有关会话、实例化和并发详细信息在这里

并发的使用与实例化模式有关。在PerCall实例化中,并发不相关,因为每个消息都由新的InstanceContext处理,因此InstanceContext中从未有多个线程处于活动状态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接