Nehmen wir an, ich habe ein großes Datenfeld, das 1000 mal pro Sekunde aktualisiert wird Eine andere Anwendung möchte auf das Array in einem kurzen Intervall zugreifen und es lesen. Beide Anwendungen befinden sich auf demselben Computer.
Ich habe versucht, WCF für die Kommunikation zwischen Prozessen zu verwenden, aber das Serialisieren und Senden des gesamten Arrays (oder eines großen Objekts) tausende Male pro Sekunde ist in der Performance nicht durchführbar Gibt es eine Möglichkeit, direkt auf Objekte aus verschiedenen Anwendungen in c # zuzugreifen?
Es gibt ein paar IPC-Technologien, die Sie verwenden können, obwohl WCF mit Datumsangaben noch heute relevant sind.
Pipes ist eine solche Technologie. Es ist binär, läuft im Kernel-Modus und sehr schnell! Obwohl es ziemlich niedrig ist und nicht Zugriff auf "Objekte" gewährt.
.NET Remoting wird Zugriff auf Objekte geben, ist aber möglicherweise nicht so schnell wie Pipes.
Sowohl die Pipes als auch das .NET-Remoting sind schneller als die Serialisierungs-Technologien WCF, die Dinge in ausführliches XML / SOAP umwandeln.
COM ist ein binäres Protokoll für IPC. COM ist ein Client-Server-Modell, bei dem der Client Daten vom COM- oder OLE-Server anfordert. Das Schöne an COM ist, dass Sie Direktzugriff auf Objekte im Server haben - sie sind nicht serialisiert. Sie können beispielsweise ein Element in einem SAFEARRAY anfordern.
A SAFEARRAY
ist eine automatisierungssichere Struktur beliebiger Dimensionen, die aus typsicheren Daten besteht. Glücklicherweise wird .NET den SAFEARRAY Goobble-de-Gook für uns verstecken.
In meinem Beispiel habe ich eine Klasse Manager
erstellt, die das Array freilegt. Um zum Manager
zu gelangen, habe ich ein Factory-Muster verwendet, so dass Manager
im Wesentlichen ein Singleton ist.
Sie sollten Ihr Projekt wie folgt planen:
Factory
, Manager
Zuerst die Verträge:
%Vor%Nun zum Fabrikmuster:
%Vor%Der Manager:
%Vor%Eine Test-App Dies sollte nur auf die MyComLib.Contracts.dll und not MyComLib.dll verweisen.
%Vor% Ein letzter Schritt besteht darin, diesen in-process COM-Server in einen prozessexternen COM-Server zu ändern, damit mehrere Prozesse dieselbe Manager
und Erstelle keine eigenen Singletons. In anderen Worten, ein Singleton, der Prozesse überspannt. Wenn das Manager
ausgeführt wird, ist es im Wesentlichen in seinem eigenen Prozessbereich getrennt von allen anderen Client-Prozessen.
Dafür müssen Sie einen COM-Ersatz konfigurieren, der im Detail erklärt wird hier .
Schließlich können Sie mit File Mapping eine Datei so bearbeiten, als wäre sie nicht mehr als ein großer Speicherblock im Adressraum des Prozesses. Keine knifflige Dateisuche; Lese- / Schreibvorgänge. Greifen Sie einfach einen Zeiger auf den Speicherblock und beginnen Sie zu lesen / schreiben. Das System erledigt den Rest.
MSDN:
Sie können einen speziellen Fall der Dateizuordnung verwenden, um einen benannten gemeinsamen Speicher zwischen Prozessen bereitzustellen. Wenn Sie beim Erstellen eines Dateizuordnungsobjekts die Systemaustauschdatei angeben, wird das Dateizuordnungsobjekt als gemeinsamer Speicherblock behandelt. Andere Prozesse können auf denselben Speicherblock zugreifen, indem sie dasselbe Dateizuordnungsobjekt öffnen. Erzähl mir mehr
Leider erfordert es immer noch, dass Sie Ihre Daten an erster Stelle schreiben, und damit es am effektivsten ist, müssten Sie Ihre Anwendung ändern, um den Speicherblock als Quelle der Wahrheit und nicht als Array im Speicher zu behandeln. Sonst werden Sie die ganze Zeit serialisieren.
Shared Memory über die Auslagerungsdatei ermöglicht es Ihnen jedoch technisch, jede serialisierte De-Serialisierung zwischen Ihren Client-Server-Anwendungen und die Duplizierung von Daten "auf dem Heap" zu eliminieren. Wie gesagt, Sie müssen Ihre App möglicherweise anpassen, um mit Raw-Speicherpuffern statt mit Objekten zu arbeiten.
HINWEIS: Entgegen der landläufigen Meinung ist .NET Remoting nicht vollständig veraltet . Eine sinnvolle Verwendung dafür ist die Kommunikation zwischen Objekten in verschiedenen AppDomains
innerhalb desselben Prozesses, was Sie normalerweise in plug-in systems
tun.
Tags und Links c# object sharing interprocess