У меня есть два консольных приложения, написанные на C #.Я пытаюсь обмениваться сообщениями между ними.В попытке сделать это я использую непостоянные отображенные в память файлы .В моем сценарии одно консольное приложение является родительским, а другое - дочерним.Иногда родитель отправляет сообщение ребенку.В других случаях ребенок отправит сообщение родителю.
Хотя я не могу понять, как это сделать.Как будто каждый процесс либо слушает, либо говорит.Это не активно делает оба.В настоящее время я пытаюсь обмениваться сообщениями между двумя процессами, используя 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
, требуемый с обеих сторон, блокирует файл.
Я что-то неправильно понимаю?Я использую неправильную вещь для обмена сообщениями между двумя процессами?Я знаю, что не могу использовать Трубы для моего сценария, поэтому я пошел с файлами, отображенными в память.