- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了 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/
我是一名优秀的程序员,十分优秀!