6

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

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

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

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

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

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

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

非常感谢您的意见!

4

2 回答 2

9

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

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

于 2009-03-08T09:49:48.960 回答
6

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

马克

于 2009-03-07T08:47:51.800 回答