我有两个用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,这就是为什么要使用内存映射文件。
答案 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,并从孩子到父母做同样的事情
不要忘记在处理完成后配置资源