2009-03-06 9 views
6

Ich habe ein interessantes Design-Problem und ich hatte gehofft, Sie alle könnten einige Vorschläge machen. Ich bin mit C# und .NET 3.0In-Prozess-Kommunikation Design mit WCF (.NET)

Ich habe ein sehr schönes, erweiterbares Framework auf der WCF gebaut, die die Einrichtung von Endpunkten und die Erstellung von Verträgen automatisieren. Das System, in dem ich arbeite, könnte auf verschiedene Arten ausgeführt werden - Endpunkte könnten irgendwo anders im Internet sein, in verschiedenen Assemblies auf derselben Box laufen oder sogar in demselben Prozess laufen. WCF ist großartig, um all dies transparent zu machen, aber im letzten Fall möchte ich die Effizienz verbessern:

Ich würde gerne den Overhead der Serialisierung von Objekten vermeiden, die nicht wirklich irgendwohin gehen. Es macht wirklich keinen Sinn, zwischen zwei Threads in derselben Assembly zu kommunizieren. Gleichzeitig möchte ich das WCF-basierte Framework nutzen, das bereits vorhanden ist, weil es viel einfacher zu pflegen ist, wenn wir nicht zwei separate Kommunikationswege haben, abhängig von der Systemkonfiguration.

Mein erster Gedanke war, Objektzeiger in einem unsicheren Kontext verwenden - nicht die Serialisierung zu kämpfen, sondern nur den Mindestbetrag serialisiert. Meine Sorge dabei ist, dass bei asynchronen Nachrichten in Umgebungen, in denen der GC aggressiv ist, die Nachricht möglicherweise und wahrscheinlich verschwunden ist, bevor wir die Möglichkeit haben, den darin enthaltenen Zeiger zu dereferenzieren, was zu vielen Problemen führen würde.

Mein nächster Gedanke war, GCHandles zu verwenden, aber ich bin unsicher über ihr Verhalten - wenn ein GCHandle nicht mehr referenziert wird, aber einen Verweis auf ein verwaltetes Objekt enthält, werden beide vom GC bereinigt, oder keines? Ich mache mir Sorgen darüber, ein großes Speicherleck einzuführen, indem ich diese benutze, weil die Chance, dass eine Nachricht verloren geht, groß ist, und wir nicht Free() anrufen können, und die Dokumentation, die ich finden kann, fehlt .

Ein anderer Gedanke ist Reflexion zu verwenden, um alle verwalteten Objekte zu sehen, aber es scheint, wie der Aufwand für das wäre riesig, und das System muss so effizient wie möglich sein.

Also, zusammenfassend, ich versuche, ein Objekt über einen Prozess mit WCF ohne Serialisierung zu senden, was bedeutet, dass ich es am Leben zu halten, auch wenn es vorübergehend keine Referenzen hat. Es scheint, als ob es möglich sein könnte, aber ich frage mich, ob ich versuche, meinen Kuchen zu essen und es auch zu essen.

Vielen Dank für Ihre Eingabe!

Antwort

6

Ich würde das "NetNamedPipes" -Transportprotokoll in WCF untersuchen, das speziell für die Kommunikation zwischen Prozessen auf derselben Maschine entwickelt wurde und das so wenig Overhead wie möglich hat (einschließlich schneller binärer Serialisierung).

Marc

9

Schauen Sie sich die Null-Transport in diesem Artikel zu binden.

http://www.codeproject.com/KB/WCF/NullTransportForWCF.aspx

+0

Nette Idee, diese Umsetzung nicht für mich, obwohl arbeiten, und ich bekomme ein 'System.NotImplementedException' in' NullChannelFactory \ '1.OnBeginOpen (Timespan-Timeout, AsyncCallback Rückruf, Objektzustand)'. Da dieses Projekt nicht offen ist, ist es nicht einfach, es zu verlängern und zurückzuzahlen. –