【问题标题】:In-process communication design with WCF (.NET)使用 WCF (.NET) 进行进程内通信设计
【发布时间】:2009-03-06 22:24:50
【问题描述】:

我有一个有趣的设计问题,希望大家能提出一些建议。我正在使用 C# 和 .NET 3.0

我有一个非常好的、可扩展的框架,它构建在 WCF 之上,可以自动设置端点和创建合同。我正在使用的系统可以以不同的方式运行——端点可以在互联网上的其他地方,在同一个盒子上的不同程序集中运行,甚至在同一个进程中运行。 WCF 非常适合使所有这些透明化,但在最后一种情况下,我想提高效率:

我很想避免序列化并没有真正去往任何地方的对象的开销。在同一个程序集中的两个线程之间进行通信确实没有意义。同时,我想利用已经存在的基于 WCF 的框架,因为如果我们没有两个独立的通信路径,这将更容易维护,具体取决于系统的设置。

我的第一个想法是在不安全的上下文中使用对象指针——不要与序列化作斗争,而是只序列化最小数量。我对此的担忧是,在 GC 具有攻击性的环境中的异步消息上,在我们有机会取消引用其中包含的指针之前,该消息可能并且很可能会消失,这会导致很多问题。

我的下一个想法是使用 GCHandle,但我不确定它们的行为 - 如果 GCHandle 不再被引用,但包含对托管对象的引用,是否都被 GC 清理了,或者两者都没有?我担心使用这些会引入巨大的内存泄漏,因为消息丢失的可能性很大,我们将无法调用 Free(),而且我能找到的文档是......缺少.

另一种想法是使用反射来查看所有托管对象,但这样做的开销似乎很大,而且这个系统必须尽可能高效。

因此,总而言之,我正在尝试使用 WCF 跨进程发送一个对象而不对其进行序列化,据我所知,这意味着即使它暂时没有引用也保持它的活动状态。看起来应该是可能的,但我想知道我是否也想吃蛋糕。

非常感谢您的意见!

【问题讨论】:

    标签: wcf garbage-collection reference communication


    【解决方案1】:

    查看本文中的空传输绑定。

    http://www.codeproject.com/KB/WCF/NullTransportForWCF.aspx

    【讨论】:

    • 好主意,不过这个实现对我不起作用,我在NullChannelFactory`1.OnBeginOpen(TimeSpan timeout, AsyncCallback callback, Object state) 中得到一个System.NotImplementedException。由于这个项目不是开源的,因此扩展和回馈并不简单。
    【解决方案2】:

    我将研究 WCF 中的“NetNamedPipes”传输协议,该协议专为同机、进程间通信而设计,并且开销尽可能小(包括快速二进制序列化)。

    马克

    【讨论】:

      猜你喜欢
      • 2011-09-15
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多