wcf - 为什么我的消息在单个 WCF TCP channel (使用 ConcurrencyMode.Reentrant)上被乱序处理?

标签 wcf multithreading asynchronous

客户端通过单个 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);

最佳答案

我现在已经解决了这个问题:

  • 将我从服务器到客户端的所有回调更改为 OneWay
  • 在从服务器传递任何回调之前在客户端中使用调度程序,因此客户端代码永远不会从回调中调用服务器
  • 客户端回调对象标有 CallbackBehavior( UseSynchronizationContext=false , ConcurrencyMode=ConcurrencyMode.Single)
  • 在 Winform 或 WPF 中运行时,我使用 SynchronizationContext。 发帖 发送回调
  • 当客户端是控制台或 Windows 服务器时,我使用 custom depatcher .
  • 所以让我在服务器和客户端上都使用 ConcurrencyMode.Single。

  • 它现在按预期工作。
    (BeginMyMethod(x, b) 仍然用于从客户端向服务器发送消息)

    (即使在处理传入消息的某个线程上没有进行 WCF 调用时,ConcurrencyMode.Reentrant 似乎有时也会释放锁,它只是没有用,因为 Reentrant 在 DCOM 中)

    关于wcf - 为什么我的消息在单个 WCF TCP channel (使用 ConcurrencyMode.Reentrant)上被乱序处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2280756/

    相关文章:

    wcf - 如何在启动时使用 WCF 和 IIS 连接到 ActiveMQ

    c# - "using"语句中出现异常,WCF 未正确关闭连接。如何关闭有故障的 WCF 客户端连接或有异常的连接?

    java - Spring Data Repository 多线程性能

    c++ - 在C++中使用回调异步运行linux命令

    java - 队列来管理函数调用

    javascript - 如何使用 JavaScript 异步链接函数?

    c# - 如何创建 JSON 以匹配/序列化到 WCF Rest 服务中的 DataContract

    c# - WCF 代理在调用外部 API 后失败

    java - 发出 HTTP 请求时在 Java 中实现超时的最佳方法

    java - JNI线程模型?