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