在两个C#进程之间交换消息

时间:2018-10-24 15:16:28

标签: c# messaging

我有两个用C#编写的控制台应用程序。我正在尝试在它们之间交换消息。为了做到这一点,我正在使用non-persisted memory-mapped files。在我的情况下,一个控制台应用程序是父级,另一个是子级。有时,父母会向孩子发送消息。有时,孩子会向父母发送消息。

虽然我不知道该怎么做。就像每个过程都在听或说。它并没有同时做这两个事情。目前,我正在尝试使用struct来定义两个进程之间的消息交换:

public struct Message
{
  public string Source { get; set; }

  public string Text { get; set; }
}

我的父控制台应用程序具有如下所示的方法:

private void SendMessageToChild(string text, int childHandle)
{
  Console.WriteLine("Sending message to child...");

  var messageChannelFileName = childHandle.ToString() + ".msgs";
  using (var messageChannelFile = MemoryMappedFile.CreateOrOpen(messageChannelFileName, 10240))
  {
    using (var memoryMappedAccessor = messageChannelFile.CreateViewAccessor())
    {
      var message = new Message();
      message.Text = text;
      message.Source = "Parent";

      memoryMappedAccessor.Write<Message>(0, ref message);
    }
  }

  Console.ReadKey(); // This is to keep the memory mapped file open for the child to be able to read it
  Console.WriteLine("Successfully sent message to child.");
}

我的子控制台应用程序(进程)具有如下所示的方法:

private void StartListening()
{
  Task.Run(() =>
  {
    var messageChannelFileName = Process.GetCurrentProcess().Id + ".msgs";
    using (var messageChannelFile = MemoryMappedFile.OpenExisting(messageChannelFileName, MemoryMappedFileRights.Read))
    {
      var message = new Message();
      using (var messageAccessor = messageChannelFile.CreateViewAccessor(0, 0, MemoryMappedFileAccess.Read))
      {
        messageAccessor.Read<Message>(0, out message);
        Console.WriteLine(message.Text);
      }
    }

    Console.ReadKey();  // This is to keep the memory mapped file
  });
}

此方法无效。我从没看到消息打印到控制台窗口。同时,我看不到一种来回发送消息的方法。我认为,两边都需要Console.ReadKey来锁定文件。

我误会了吗?我使用错误的东西在两个进程之间交换消息吗?我知道我无法在场景中使用Pipes,这就是为什么要使用内存映射文件。

1 个答案:

答案 0 :(得分:0)

两个进程之间的交流真的很容易

例如,父进程可以这样做:

const char* sStrings[] = {"string1", "string2", ... "string9000"};
m_vStrings = vector<string>(sStrings, end(sStrings));

子进程示例:

        // create EventWaitHandle, MemoryMapped and accessor
        ewh = new EventWaitHandle(false, EventResetMode.AutoReset, "ewhFreePIE");
        memory = MemoryMappedFile.CreateOrOpen("hookFreePIE", 68, MemoryMappedFileAccess.ReadWrite);
        accessor = memory.CreateViewAccessor();
                    :
                    :
        // Send message with accessor.write                     
        ewh.Set();//say to other process, there is something to read

如果您希望孩子将其发送给父母,则可以创建另一个EventWaithandle,并从孩子到父母做同样的事情

不要忘记在处理完成后配置资源