使用WCF (.NET)进行进程间通信设计

6
我有一个有趣的设计问题,希望你们能提出一些建议。我正在使用C#和.NET 3.0。
我已经建立了一个非常好的可扩展框架,基于WCF,可以自动设置端点和创建合同。我正在处理的系统可以以不同的方式运行 - 端点可能在互联网上的其他地方,在同一台计算机上的不同程序集中运行,甚至在同一进程中运行。WCF非常适合使所有这些透明化,但是在最后一种情况下,我想提高效率:
我想避免序列化那些实际上并没有去任何地方的对象的开销。在同一程序集中的两个线程之间进行通信时,这样做没有任何意义。同时,我想利用已经存在的基于WCF的框架,因为如果我们不依赖于系统的设置而有两个单独的通信路径,那么维护起来会更容易。
我的第一个想法是在不安全的上下文中使用对象指针 - 不要与序列化作斗争,而只序列化最少量的内容。我担心的是,在GC正在积极回收内存的异步消息中,消息可能(并且很可能)在我们有机会对其中包含的指针进行解引用之前就消失了,这会导致很多问题。
我的下一个想法是使用GCHandles,但我对它们的行为不确定 - 如果一个GCHandle不再被引用,但包含对托管对象的引用,那么两者都会被GC清理吗?我担心通过使用这些会引入巨大的内存泄漏,因为消息丢失的可能性很大,我们将无法调用Free(),而我能找到的文档...很缺乏。
另一个想法是使用反射来查看所有托管对象,但是这样做的开销似乎会很大,而且这个系统必须尽可能高效。
因此,总之,我正在尝试在WCF中跨进程发送一个对象,而不需要序列化它,这就意味着即使它暂时没有引用,也要保持其活动状态。这似乎是可能的,但我想知道是否在一心二用。
非常感谢你们的建议!
2个回答

9

不错的想法,但这个实现对我来说不起作用,我在NullChannelFactory\1.OnBeginOpen(TimeSpan timeout, AsyncCallback callback, Object state)中遇到了System.NotImplementedException`异常。由于该项目未开源,因此扩展和贡献回去并不直观。 - Evgeniy Berezovsky

6
我会调查WCF中的“NetNamedPipes”传输协议,该协议专门设计用于同一台机器上的进程间通信,并且具有最小的开销(包括快速二进制序列化)。
马克

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接