2008-10-24 4 views
5

Ich habe eine Kern-.NET-Anwendung, die eine beliebige Anzahl von Unterprozesse generieren muss. Diese Prozesse müssen auf eine Form von Statusobjekt in der Kernanwendung zugreifen können.Interprozesskommunikation in. NET

Was ist die beste Technik? Ich werde eine große Menge von Daten zwischen Prozessen (Bitmaps) verschieben, also muss es schnell sein.

Antwort

4

Ich habe ähnliche Anforderungen und verwende Windows Communication Foundation, um das jetzt zu tun. Meine Datengrößen sind jedoch wahrscheinlich etwas kleiner.

Als Referenz mache ich etwa 30-60 Anfragen von etwa 5K-30K pro Sekunde auf einem Quad-Core-Maschine. WCF hat sich bislang recht gut gehalten.

Mit WCF haben Sie die zusätzlichen Vorteile, ein Transportprotokoll und einen Sicherheitsmodus zu wählen, der für Ihre Anwendung geeignet ist.

3

Wenn Sie wirklich separate Prozesse benötigen, gibt es immer Named Pipes, die ziemlich gut funktionieren würden.

Wäre jedoch eine AppDomain-Grenze ausreichend? Dann könnten Sie Objekt Marshalling tun und die Dinge wären viel einfacher. Ihre Anwendung könnte gemeinsam genutzte Instanzen desselben Objekts mit dem Attribut MarshalByRefObject bearbeiten.

4

Ich würde zögern, bewegen große Daten um, würde ich geneigt sein, Zeiger auf große Daten herum statt dedizierten Speicherdateien.

+0

Erklären Sie, wie das über Prozessgrenzen hinweg funktionieren würde. – FlySwat

+0

Ich denke, Jarvis bedeutet, verwenden Speicherabbilddateien, um Speicher zwischen zwei oder mehr Prozessen zu teilen. – Jonke

+2

Natürlich. Memory Mapped-Dateien sind speziell dafür ausgelegt, Speicher zwischen Prozessen gemeinsam nutzen zu können. Interessanterweise hat C# 4.0 jetzt MMF-Klassen für genau diese Aufgabe eingebaut. –

3

Sie können .NET Remoting für Interprozesskommunikation (IPC) mit IpcChannel verwenden. Andernfalls können Sie nach Shared Memory-Wrappern und anderen IPC-Formularen suchen.

EDIT: Es gibt einen MSDN article Vergleich WCF mit einer Vielzahl von Methoden einschließlich Remoting. Aber wenn ich das Balkendiagramm nicht falsch lese, zeigt es Remoting an, gleich oder etwas besser zu sein (anders als der andere Kommentar sagte). Es gibt auch eine blog post über WCF vs Remoting. Der Blogpost zeigt deutlich, dass Remoting für binäre Objekte schneller ist und wenn Sie Bitmaps (binäre Objekte) übergeben, scheint Remoting oder Shared Memory oder eine andere IPC-Option schneller zu sein, obwohl WCF möglicherweise keine schlechte Wahl ist.

5

WCF wahrscheinlich die Rechnung passen würde ...

Hier ist eine really good article on .NET remoting für verteilte intensive Analyse durchgeführt wird. Obwohl Remote mit WCF ersetzt ist, so ist der Artikel relevant und zeigt, wie die Anrufe asynchron zu machen, usw.

Diese article contrasts WCF to .NET remoting - EDIT: der Schlüssel nehmen hier weg zeigt, dass WCF Durchsatz Remote für kleine Daten führt aus aber nähert Remoting Leistung als Datengröße zunimmt.

0

Es ist auch möglich, das Eenter Messaging Framework zu verwenden. Das Framework bietet die Verwendung der Broker-Komponente, bei der alle Clients abonniert werden können, um Benachrichtigungen zu erhalten, wenn der Status geändert wird. Um Clients mit dem Broker zu verbinden. Das Framework bietet Named Pipes, Tcp oder Http. Aber es sieht am besten wäre, die Named Pipes zu verwenden.

Weitere Informationen zum Framework finden Sie unter link text.