使用内存映射文件在一个盒子上的两个进程之间进行文本交换

时间:2013-12-19 19:27:13

标签: c# memory-mapped-files interprocess inter-process-communicat

要求是能够在同一个Windows框中的两个控制台应用程序之间实现“聊天”。我使用命名管道实现了这一点,通过在每个应用程序中实现发送器和接收器功能。

我想尝试相同的功能,但使用内存映射文件(虽然我认为它不适合'聊天'类型的通信)。

为简单起见,请说聊天消息只是篇幅较短的字符串。

以下是我的想法:

  

一个应用程序将负责创建互斥锁和内存映射文件。   称之为主人。

     

在每个应用程序中,我们维护两个线程,一个负责接收用户   输入和写入文件,其他负责定期   检查是否有东西要读。

     

总共有四个线程,每个线程都由一个互斥锁管理,用于访问   文件。

     

在文件中,我认为两者都应该有自己的“部分”。说   文件大小的前半部分用于主应用程序,另一半用于   第二个应用程序。

     

因此,当用户在主应用程序中输入一行文本时,线程将访问   它的一半文件并尝试在最后一个新文本后附加新文本   线。

     

当应用程序读取文件的文本部分时,如果有任何应用程序   读它并删掉它的部分。

这种做法是否正确?其他方法是如何使用源id标记消息,以便读者知道忽略自己编写的消息。但我觉得这是不必要的字符串解析。

另外,除了每个读者线程周期性地尝试读取他们的文件部分以查看是否有新数据之外,您能否建议任何类型的通知机制?事件处理类型?读者线程只有在获得某种事件通知时才会查找新消息。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我在很大程度上同意汉斯的意见,内存映射文件在这里并不理想,如果你走这条路虽然考虑使用命名事件(参见http://msdn.microsoft.com/en-us/library/windows/desktop/ms682396(v=vs.85).aspx)而不是轮询。

您可能需要p / invoke才能从c#中获取此功能。

在其余部分中,为每个应用程序提供文件的自己区域,并由主服务器管理控制部分以协调谁获得的内容。