在两个 C# 程序之间发送大量数据

Posted

技术标签:

【中文标题】在两个 C# 程序之间发送大量数据【英文标题】:Sending large volume of data between two C# programs 【发布时间】:2013-06-12 16:13:07 【问题描述】:

我目前正在为两个需要通信的独立程序开发 C#(我也可以使用 python)插件。在第一个程序中,我将 3D 几何解构为边、点、法线等。然后我将所有这些数据发送到我的第二个程序中的插件以进行重建。理想情况下,这会尽可能快地发生,以保持“实时”。

目前,我正在使用 JSON 转换我的数据,并将 JSON 写入磁盘。然后我的第二个程序监视文件更改,然后读取文件并使用 JSON 数据。

到目前为止,我整个插件的最大瓶颈是读/写过程。必须有比写入文件更快的方法。

【问题讨论】:

MemoryMappedFiles:msdn.microsoft.com/en-us/library/dd997372.aspx。您必须在开始使用文件时进行一些共享,但之后将全部在 RAM 上完成。 使用命名管道。查看NamedPipeServerStreamNamedPipeClientStream 一个 MemoryMappedFile 会引入和它解决的一样多的问题。 我可能会使用 WCF 并从 NamedPipe 绑定开始。如果需要跨多台机器共享数据,至少切换到 TCP 绑定会相对简单。 内存映射文件。通过适当的设计,您可以完全避免复制和序列化数据。 【参考方案1】:

有几种方法可以使用进程间通信。 最著名的是在不同机器之间使用:WCF(.NET 3.5) 和 Remoting(.NET 2)

对于机器上的通信,您可以选择使用命名管道或内存映射文件。

内存映射文件与您的解决方案类似,因为它们使用页面文件作为备份。

我认为命名管道解决方案是最方便的: 您设置了一个“服务器”流并等待一些“客户端”连接。 然后,您可以像通过任何其他流一样传输数据。

Here's NamedPipeServerStream.And this is NamedPipeClientStream. 那里的代码示例几乎涵盖了它。

【讨论】:

谢谢!我已经阅读了一些关于内存映射文件的内容,但我不确定这是否是正确的方法。我想我会试试命名管道。【参考方案2】:

我认为带有命名管道的 WCF 可以完成这项工作,您只需要创建将被序列化的传输对象,这一切都将由 WCF 自动完成,或者您可以只准备现有对象以通过命名管道传输开销并不大。使用 json 会很好,但它会创建额外的层,并且使用 WCF 您可以传输无需 json 翻译即可立即使用的对象。 (实际上它们被翻译成xml,但你不是自己做的,所以我认为最好用解析json来做)。

【讨论】:

以上是关于在两个 C# 程序之间发送大量数据的主要内容,如果未能解决你的问题,请参考以下文章

在进程之间发送大量数据的最佳方法是啥?

在 C# 中序列化 DataTable 会占用大量内存 - 如何改进这一点

C# 怎样实现两个窗体之间的数据共享?

可以在两个 iOS 设备之间发送数据吗?

c# listbox 显示大量数据速度很慢,如何解决?

通过 C# 网页发送大量电子邮件的最佳方式是啥?