C#中的IPC机制-使用和最佳实践

C#中的IPC机制-使用和最佳实践,c#,.net,ipc,C#,.net,Ipc,我不久前在Win32代码中使用过IPC——关键部分、事件和信号量 NET环境中的场景如何? 是否有任何教程解释所有可用选项、何时使用以及为什么使用?微软在IPC中的最新内容是。实际上,底层(tcp、upd、命名管道等)并没有什么新的功能,但WCF大大简化了IPC的开发 有用资源: 在Dobb博士的门户上 当然,还有.NET远程处理,我觉得这很酷,但我想他们现在已经淘汰了它,因为他们有了WCF。我倾向于使用命名管道或Unix套接字(取决于我是针对MS.NET还是Mono,我有一个抽象它的类)

我不久前在Win32代码中使用过IPC——关键部分、事件和信号量

NET环境中的场景如何?
是否有任何教程解释所有可用选项、何时使用以及为什么使用?

微软在IPC中的最新内容是。实际上,底层(tcp、upd、命名管道等)并没有什么新的功能,但WCF大大简化了IPC的开发

有用资源:

  • 在Dobb博士的门户上

当然,

还有.NET远程处理,我觉得这很酷,但我想他们现在已经淘汰了它,因为他们有了WCF。

我倾向于使用命名管道或Unix套接字(取决于我是针对MS.NET还是Mono,我有一个抽象它的类),因为它易于使用、可移植,并允许我轻松地与非托管代码进行互操作。也就是说,如果您只处理托管代码,那么可以使用WCF或远程处理——如果您需要Mono支持,可以使用后者,因为他们的WCF支持根本不存在。

听起来您对同步技术而不是通信感兴趣。如果是这样的话,您可能想开始,或者更进一步。

除了显而易见的(WCF)之外,C#/CLR还有一个ZeroMQ绑定,它非常好:

使用比WCF少得多的代码和配置来实现面向消息的IPC、发布/订阅和各种其他策略

如果您需要低延迟通信,它的速度至少比其他任何东西都快一个数量级,并且具有更少的延迟


关于信号量、锁、互斥体等。如果您通过通信而不是通过共享进行共享,那么与传统模式相比,您的整个负载将更少。如果您需要在机器域上使用而不是通过网络进行通信,我建议您使用内存映射文件。请参阅以下链接


微软曾经说过吗?他们有:“这个主题是针对遗留技术的遗留技术,它保留了与现有应用程序的向后兼容性,不推荐用于新的开发。现在应该使用Windows通信基础(WCF)开发分布式应用程序。”从那时起,我在远程处理方面工作了多年。。对于小规模应用(例如,传递多达1k个小对象),它是非常直接和高效的。超过这个限度,不!真的很糟糕。在发送之前必须压缩数据,这会增加额外的开销(CPU使用)。我对这个问题有一个非常令人沮丧的记忆。你需要做什么?如果需要同步对某些外部资源的访问,可以使用互斥来实现跨进程同步。+1。感谢上帝。这是第一个带有“最佳实践”味道的问题,它没有被标记为非建设性/离题(我从未见过)!!虽然2008年9月(发表此评论时)可能就是这样,但现在是2011年,Mono上的WCF已经相当成熟了。你自己看看,自己判断。嘿,第一个链接中的视频已经死了!“通过交流而不是通过分享来分享”这句话应该每天被任何正在进行并发编程的人背诵。这是什么意思?我认为这意味着,与其共享资源,让每个程序都随意声明,不如让程序与IPC直接对话。在第一个场景中,您的程序通过锁定共享资源进行“通信”。在第二种情况下,它们通过某种协议进行通信,以协调共享资源的使用<代码>进程间ipc传输已断开连接,如tcp。它有一个限制:它还不能在Windows上工作。sooo实际上并不是真正的IPC for Windows,对吗?这在添加C#标记时可能仍然很常见。您可以将本地环回适配器与ZeroMQ一起使用。不过,性能显然取决于适配器实现。然而,我不喜欢当您的意图不是通过网络进行通信时,点击网络堆栈(尽管是一个虚拟接口)的语义。就个人而言,在同一台机器上使用IPC,我认为使用管道是最好的解决方案。NET标准实现坚如磐石,完全可移植。映射内存解决方案可能提供最好的性能,但滚动自己的内存是复杂的,而且同步容易出错。“通过通信共享”:)一个.NET本地计算机API列表: