在C#中的进程间通信中等待消息

问题描述

我正在为将在同一主机上运行的2个应用程序实现IPC。 Console1和Console2。基于MS示例,我能够提出以下代码:

控制台1

private static string TextToSend;
    private static MemoryMappedFile memoryMappedFile;
    private static MemoryMappedViewAccessor accessor;

static void Main(string[] args)
{
    using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("testmap",10000))
    {
        bool mutexCreated;
        Mutex mutex = new Mutex(true,"testmapmutex",out mutexCreated);
        using (MemoryMappedViewStream stream = mmf.CreateViewStream())
        {
            BinaryWriter writer = new BinaryWriter(stream);
            writer.Write(1);
        }
        mutex.ReleaseMutex();

        Console.WriteLine("Start Process B and press ENTER to continue.");
        Console.ReadLine();

        Console.WriteLine("Start Process C and press ENTER to continue.");
        Console.ReadLine();

        mutex.WaitOne();
        using (MemoryMappedViewStream stream = mmf.CreateViewStream())
        {
            BinaryReader reader = new BinaryReader(stream);
            Console.WriteLine("Process A says: {0}",reader.ReadBoolean());
            Console.WriteLine("Process B says: {0}",reader.ReadBoolean());
            Console.WriteLine("Process C says: {0}",reader.ReadBoolean());
        }
        mutex.ReleaseMutex();
    }

    OnLoad();

    while (true)
    {
        Console.WriteLine("Enter message: ");
        TextToSend = Console.ReadLine();
        if (!String.IsNullOrEmpty(TextToSend))
        {
            SendMessage();
        }
    }
}

private static void OnLoad()
{
    memoryMappedFile = MemoryMappedFile.CreateNew("testMap",10000);
    accessor = memoryMappedFile.CreateViewAccessor();
}

private static void SendMessage()
{
    var buffer = ASCIIEncoding.ASCII.GetBytes(TextToSend);
    accessor.Write(54,(ushort)buffer.Length);
    accessor.WriteArray(54 + 2,buffer,buffer.Length);
}

private static void ReadMessage()
{
    var size = accessor.ReadUInt16(54);
    var buffer = new byte[size];
    accessor.ReadArray(54 + 2,buffer.Length);
    Console.WriteLine(ASCIIEncoding.ASCII.GetString(buffer));
}

控制台2

private static string TextToSend;
        private static MemoryMappedFile memoryMappedFile;
        private static MemoryMappedViewAccessor accessor;

        static void Main(string[] args)
        {
            try
            {
                using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("testmap"))
                {

                    Mutex mutex = Mutex.OpenExisting("testmapmutex");
                    mutex.WaitOne();

                    using (MemoryMappedViewStream stream = mmf.CreateViewStream(1,0))
                    {
                        BinaryWriter writer = new BinaryWriter(stream);
                        writer.Write(0);
                    }
                    mutex.ReleaseMutex();
                }
            }
            catch (FileNotFoundException)
            {
                Console.WriteLine("Memory-mapped file does not exist. Run Process A first.");
            }

            Console.ReadLine();
        }

        private static void OnLoad()
        {
            memoryMappedFile = MemoryMappedFile.CreateNew("testMap",10000);
            accessor = memoryMappedFile.CreateViewAccessor();
        }

        private static void SendMessage()
        {
            var buffer = ASCIIEncoding.ASCII.GetBytes(TextToSend);
            accessor.Write(54,(ushort)buffer.Length);
            accessor.WriteArray(54 + 2,buffer.Length);
        }

        private static void ReadMessage()
        {
            var size = accessor.ReadUInt16(54);
            var buffer = new byte[size];
            accessor.ReadArray(54 + 2,buffer.Length);
            Console.WriteLine(ASCIIEncoding.ASCII.GetString(buffer));
        }

我的问题是,如何使这2个应用程序中的每一个都等待对方的消息?意思是,一旦Console1发送一条消息,Console2就会获取该消息并将其写入控制台,反之亦然。谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...