客户端通过单个 WCF channel 从单个线程向服务器发送大量消息。
客户端使用 BeginMyMethod(x, b) 发送消息,因为它不希望在处理消息时阻塞。
我们开启了可靠的消息传递,因为我们不希望丢失任何消息,或者让它们失序。
但是,这些消息是在服务器上的多个线程上发送的,因此正在无序处理。
我们不能让服务器是单线程的,因为我们不希望来自一个客户端的长时间运行的请求阻塞 其他客户 .
所以我只想处理来自 的所有消息。单例客户端(通过 单 channel )在 订购 与 只有一个 一次处理来自每个客户端的消息。
这对于原始套接字编程很容易,但是如何让 WCF 按我的意愿工作?
我现在认为 ConcurrencyMode.Reentrant 与 InstanceContextMode.Single 一起使用时表现不佳
(使消息乱序的测试没有回调,也不会进行任何传出 WCF 调用,因此我希望 ConcurrencyMode.Reentrant 在该给定测试中的行为与 ConcurrencyMode.Single 相同,但事实并非如此)
我没有使用任何 WCF 配置文件,代码是:
serviceHost = new ServiceHost(this);
serviceHost.AddServiceEndpoint(
typeof(IAllEngineManagersAsyncCallbacks),
new NetTcpBinding(SecurityMode.None, true),
endPointAddress);
最佳答案
我现在已经解决了这个问题:
它现在按预期工作。
(BeginMyMethod(x, b) 仍然用于从客户端向服务器发送消息)
(即使在处理传入消息的某个线程上没有进行 WCF 调用时,ConcurrencyMode.Reentrant 似乎有时也会释放锁,它只是没有用,因为 Reentrant 在 DCOM 中)
关于wcf - 为什么我的消息在单个 WCF TCP channel (使用 ConcurrencyMode.Reentrant)上被乱序处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2280756/