gpt4 book ai didi

c# - 在 WCF 回调中收到的消息乱序

转载 作者:行者123 更新时间:2023-11-30 18:18:55 24 4
gpt4 key购买 nike

我遇到了 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
{
...
}

回调接口(interface):

[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 时,问题就消失了。

解决这个问题的正确方法是什么?

最佳答案

我敢打赌,您想将 InstanceContextMode 更改为单线程。

session 、实例化和并发详细信息 here .

The use of concurrency is related to the instancing mode. In PerCall instancing, concurrency is not relevant, because each message is processed by a new InstanceContext and, therefore, never more than one thread is active in the InstanceContext.

关于c# - 在 WCF 回调中收到的消息乱序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40256739/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com