Objektfreigabe zwischen Anwendungen?

8

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?

    
brandon 05.02.2015, 02:11
quelle

1 Antwort

25

Es gibt ein paar IPC-Technologien, die Sie verwenden können, obwohl WCF mit Datumsangaben noch heute relevant sind.

Rohre

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

.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

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:

  • MyComLib.Contracts.dll - enthält alle Schnittstellen
  • MyComLib.dll - enthält die Implementierung von 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 .

Dateizuordnung / Shared Memory

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.

Erzähl mir mehr

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.

    
MickyD 05.02.2015 02:21
quelle

Tags und Links