Objekt-Sharing zwischen Anwendungen?
Sagen wir, ich habe eine große Daten-array aktualisiert, 1000+ mal pro Sekunde.
Eine andere Anwendung zugreifen möchte, und Lesen Sie das array in einer kurzen Zeit. Beide Anwendungen sind auf der gleichen Maschine.
Habe ich versucht, mit Hilfe von WCF für die Kommunikation zwischen Prozessen, aber serialisieren und senden Sie die ganze Palette (oder einem großen Objekt), Tausende Male pro Sekunde ist nicht machbar Leistung Weise.
Gibt es eine Möglichkeit, direkt auf Objekte aus verschiedenen Applikationen in c#?
- Was machst du, dass ist Update ein Daten-array 1000+ mal pro Sekunde? Das klingt wie ein archetchture Problem. Brauchen Sie wirklich alle Updates werden in Echtzeit gesendet? Können Sie queue-updates? Können Sie batch-updates, so dass mehr als ein update gesendet wird, in der eine "Nachricht"?
- sharedmemory.codeplex.com vielleicht
- Chamberlain Spielen/Simulationen, die Sie benötigen Echtzeit-Verarbeitung. Ja, vielleicht ist es eine fehlerhafte Ansatz, um separate Komponenten, und führen Sie Sie in verschiedenen Anwendungen.
- Wenn es gaming ist, würde ich neu bewerten, was die Netto-Gewinne, Sie werden immer aus separaten Anwendungen, und sind diese Gewinne Wert, die Kosten von dieser Langsamkeit. Wenn es Simulationen würde ich versuchen, batch-oder queue-Daten zu senden, die Sie in größere Stücke, so dass die overhead-Kosten pro update kann abgeschrieben werden.
- sharedmemory klingt toll, aber es ist nur in der Lage zu teilen, Puffer und arrays von primitiven, keine Objekte, kein Objekt - arrays- hätten Sie serialisiert werden und dann geschrieben, dass shared buffer, wie Rohre.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es ein paar IPC-Technologien, die Sie verwenden können, obwohl die pre-date WCF heute noch relevant sind.
Rohre
Rohre ist eine solche Technologie. Es ist binary, läuft im Kernel-Modus und sehr schnell! Obwohl, es ist ziemlich low-level und hat nicht geben Zugriff auf "Objekte".
.NET Remoting
.NET Remoting geben wird, die den Zugriff auf Objekte ist, aber vielleicht nicht so schnell wie Rohre.
Beide Rohre und .NET remoting schneller als die Serialisierung-Technologien WCF konvertiert Dinge zu verbose-XML/SOAP.
COM
COM ist ein Binär-Protokoll für IPC. COM ist ein client-server-Modell, bei dem der client fordert Daten von der COM-oder OLE-server. Die Schönheit über COM ist, dass Sie direkten Zugang, um Objekte in der server - Sie sind nicht serialisierte. Zum Beispiel das anfordern eines Elements in einer SAFEARRAY.
Einen
SAFEARRAY
ist ein Automatisierungs-safe-Struktur von beliebigen Dimensionen, bestehend aus Typ-sicheren Daten. Zum Glück .NET verstecken Sie die SAFEARRAY-fressen-de-Kauderwelsch für uns.In meinem Beispiel habe ich eine
Manager
Klasse, aussetzen wird die array. Man dieManager
ich habe ein factory-pattern, so dassManager
ist im wesentlichen ein singleton.Legen Sie Ihr Projekt wie folgt:
Factory
,Manager
Erste Verträge:
Nun für die Fabrik-Muster:
Manager:
Eine test-app. Dies sollte nur Verweis auf die MyComLib.Contracts.dll und nicht MyComLib.dll.
Ein letzter Schritt ist, dies zu ändern in-Prozess COM-server zu einem out-of-process - COM-server, so dass mehrere Prozesse jede Aktie die gleiche
Manager
und erstellen Sie nicht Ihr eigenes singletons. In otherwords, einem singleton, das die Bereiche Prozesse. Wenn dieManager
läuft, ist es im wesentlichen, in einem eigenen Prozess Raum, getrennt von all den anderen client-Prozesse.Dafür benötigen Sie zum konfigurieren einer COM-surrogate, die im detail erläutert wird hier.
Datei Mapping/Shared Memory
Schließlich, Datei-Zuordnung ermöglicht die Bearbeitung einer Datei, als ob es nichts weiter als ein großer block von Speicher in den Prozess-Adressbereich. Keine fummeligen Datei suchen; Lesen/schreiben-Operationen. Nehmen Sie sich einfach ein Zeiger auf den Speicherblock und anfangen zu Lesen/schreiben. Das system wird den rest erledigen.
MSDN:
Leider tut es immer noch verlangen, dass Sie schreiben Ihre Daten in den ersten Platz und für die es am wirkungsvollsten zu sein, würden Sie brauchen, um Ihre Anwendung zur Behandlung der Speicher-block als Quelle der Wahrheit, anstatt mit dem array im Speicher. Sonst werden Sie serialisiert die ganze Zeit.
Jedoch, shared memory-über die swap-Datei ist technisch erlauben, Sie zu beseitigen serialisieren-de-serialisieren zwischen Ihren client-server-apps und Vervielfältigung von Daten "auf Halde". Obwohl, wie ich sagte, müssen Sie möglicherweise passen Sie Ihre app an die Arbeit mit raw-Puffer eher als Objekte.
Erzähl mir mehr
HINWEIS: Entgegen der landläufigen Meinung .NET Remoting ist nicht ganz veraltet. Eine contemory verwenden, denn es ist die Kommunikation zwischen Objekten in verschiedenen
AppDomains
im gleichen Prozess, etwas, was Sie normalerweise tun, inplug-in systems
.bypass WCF
vollständig und senden Sie unformatierte binäre Daten - Sie Steuern die Serialisierung auf der byte-Ebene. Das wird deutlich aus-führen WCF. Viel Glück!