C# 使用内存映射文件在框上的两个进程之间进行文本交换

C# 使用内存映射文件在框上的两个进程之间进行文本交换,c#,memory-mapped-files,interprocess,inter-process-communicat,C#,Memory Mapped Files,Interprocess,Inter Process Communicat,要求是能够在同一个windows机箱上的两个控制台应用程序之间实现类似“聊天”的通信。我通过在每个应用程序中实现发送方和接收方功能,使用命名管道实现了这一点 我想尝试相同的功能,但使用内存映射文件(尽管我认为它不适合“聊天”类型的通信) 为了简单起见,假设聊天信息只是长度较短的字符串 以下是我的想法: 一个应用程序将负责创建互斥锁和内存映射文件。 叫它主人 在每个应用程序中,我们维护两个线程,一个负责接收用户 输入并写入文件,另一方定期负责 检查它是否有要阅读的内容 因此总共有四个线程,每个线程

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

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

为了简单起见,假设聊天信息只是长度较短的字符串

以下是我的想法:

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

在每个应用程序中,我们维护两个线程,一个负责接收用户 输入并写入文件,另一方定期负责 检查它是否有要阅读的内容

因此总共有四个线程,每个线程都由一个互斥对象控制,以访问 文件

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

所以当用户在主应用程序中输入一行文本时,线程访问 它是文件的一半,并尝试在最后一个新文本之后追加新文本 线路

当应用程序读取其文件部分的文本时(如果有),应用程序 读它并把它的部分删掉

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

另外,除了每个读线程周期性地尝试读取文件的部分以查看是否有新数据之外,您可以建议任何类型的通知机制吗?什么样的事件处理?阅读器线程只有在收到某种事件通知时才会去寻找新消息


>任何想法?

< P>我同意汉斯,在大多数情况下,内存映射文件在这里并不理想,如果你走这条路,尽管考虑使用命名事件(参见)而不是轮询。 您可能需要p/invoke从c#获取此功能


在其余部分,为每个应用程序提供其自己的文件区域,并由主应用程序管理一个控制部分,以协调谁得到什么。

从长远来看,这并不理想。消息符合流协议。已经被命名管道、套接字和消息队列很好地覆盖了。@HansPassant我知道这并不理想。但是,如果你被限制使用一个内存映射文件,那该怎么办?如果我被这种不合理的技术选择所限制,在这件事上没有发言权,那么我就辞职。@HansPassant有趣的是:)顺便说一下,这个练习是一次面试的一部分,而且有人提到MMF是一个选项,我只是好奇,如果这是唯一的选择,如何才能做到最好。我甚至在被录用之前都不想辞职。嗯,是的,假问题。我做了很多采访,我知道这种模式。这是一个标准的伎俩,不是我最喜欢的伎俩,提出一些完全荒谬的建议,看着候选人局促不安地不说出他应该说的话。你不是在测试你的技术能力,你是在测试你的能力,你有一个意见,并有足够的信心,使自己坚持下去。这是一个非常重要的特征,没有人愿意雇佣“代码猴子”。你能做的最糟糕的事情就是不说出你的想法,仅仅因为你认为面试官知道的比你多。