Laden...

Interprozesskommunikation über MemoryMappedFiles

Erstellt von Stu42 vor 7 Jahren Letzter Beitrag vor 7 Jahren 8.716 Views
S
Stu42 Themenstarter:in
506 Beiträge seit 2006
vor 7 Jahren
Interprozesskommunikation über MemoryMappedFiles

Hi,

anbei eine kleine Klasse zur schnellen Interprozesskommunikation über MemoryMappedFiles.
Die Komponente kann benutzt werden um Daten zwischen verschiedenen AppDomains oder Prozessen einfach und schnell auszutauschen.
Mehrere Teilnehmer teilen sich dabei einen Kanal. Schreibt ein Teilnehmer eine Byte-Nachricht, wird sie von allen anderen Teilnehmer Empfangen.

Anwendungsprogramm:


class Program
    {
        static void Main(string[] args)
        {
            IpcMmfTransition participantA = new IpcMmfTransition("TestChannel");
            IpcMmfTransition participantB = new IpcMmfTransition("TestChannel");
            IpcMmfTransition participantC = new IpcMmfTransition("TestChannel");

            participantA.DataAvailable += (transition, bytes) =>
            {
                Console.WriteLine("A received: " + Encoding.ASCII.GetString(bytes));
            };
            participantB.DataAvailable += (transition, bytes) =>
            {
                Console.WriteLine("B received: " + Encoding.ASCII.GetString(bytes));
            };
            participantC.DataAvailable += (transition, bytes) =>
            {
                Console.WriteLine("C received: " + Encoding.ASCII.GetString(bytes));
            };

            participantA.Run();
            participantB.Run();
            participantC.Run();

            while(participantC.GetNumberOfParticipants() < 3)
                Thread.Sleep(1);

            participantA.Transmit(Encoding.ASCII.GetBytes("A says Hello"));
            participantB.Transmit(Encoding.ASCII.GetBytes("B says Hello"));
            participantC.Transmit(Encoding.ASCII.GetBytes("C says Hello"));

            Thread.Sleep(500);

            participantA.Dispose();
            participantB.Dispose();
            participantC.Dispose();

            Console.ReadKey();
        }
    }
}

Das Programm mit dem benötigten Microsoft.Diagnostics.Runtime-Assembly befindet sich im Anhang.
Da ich die Komponente auch in meinen aktuellen Projekt einsetze, nehmen ich Fehler und anregungen gerne entgegen.

Liebe Grüße,
Stu

Edit: Mit NuGet

Schlagwörter: Interprozesskommunikation; Memory Mapped Files

16.806 Beiträge seit 2008
vor 7 Jahren

Du solltest NuGet für das Mitführen der Microsoft.Diagnostics.Runtime verwenden.
Diese ist nämlich nach https://www.microsoft.com/net/dotnet_library_license.htm lizenziert und darf IIRC nicht so direkt im Programm oder im ZIP mitgeführt werden.

Zudem gibt es von Microsoft.Diagnostics.Runtime bisher kein Stable Release!
.. also alles andere als empfehlenswert für den produktiven Betrieb.

S
Stu42 Themenstarter:in
506 Beiträge seit 2006
vor 7 Jahren

Ich hatte kein NuGet dafür gefunden - wohl nicht gut genug gesucht. Ich werds ändern.