2009-03-06 11 views
6

私は興味深いデザイン上の問題があり、皆さんからお勧めしたいと思っていました。私はC#と.NET 3.0WCF(.NET)を使用したインプロセスコミュニケーションデザイン

私は、エンドポイントの設定や契約の作成を自動化するWCFの上に構築された非常に素晴らしい、拡張可能なフレームワークを持っているを使用しています。私が取り組んでいるシステムは、さまざまな方法で実行できます。エンドポイントは、インターネット上の別の場所にあるか、同じボックス上の異なるアセンブリで実行されているか、同じプロセスで実行されている可能性があります。 WCFは、この透明のすべてを作るための素晴らしいですが、最後のケースでは、私は効率を改善したいと思います:

私は本当にどこにも行かれていないオブジェクトをシリアル化のオーバーヘッドを回避してみたいです。同じアセンブリ内の2つのスレッド間で通信することは、実際には何の意味もありません。同時に、WCFベースのフレームワークを既に利用しています。これは、システムの設定によって2つの別々の通信経路がない場合には、維持管理が非常に簡単になるためです。

私が最初に考えたのは、安全でないコンテキスト内のオブジェクトのポインタを使用していた - シリアル化を戦わないし、だけに最小量をシリアライズ。私の懸念事項は、GCが積極的な環境での非同期メッセージでは、メッセージに含まれるポインタを間接参照する機会が来る前にメッセージが消滅している可能性があるということです。

私の次の考えは、GCHandlesを使用することでしたが、GCHandleはもはや参照されていませんが、管理対象オブジェクトへの参照が含まれていてGCでクリーンアップされているか、私は、メッセージが失われる可能性が大きいので、これらを使って膨大なメモリリークを導入することを心配しています。私たちはFree()を呼び出すことができません。 。

もう一つの考えは、すべての管理対象オブジェクトを探すためにリフレクションを使用することですが、巨大になり、このためのオーバーヘッドのように思えるが、このシステムは、可能な限り効率的でなければなりません。

ので、要約すると、私は私の知る限り、それは一時的に何の参照を持っていなくても生きてそれを維持する手段を言うことができるように、それをシリアル化することなく、WCFとプロセス間でオブジェクトを送信しようとしています。それは可能なはずですが、私はケーキを食べて食べようとしているのだろうかと思います。

は、あなたの入力をありがとうございました!

答えて

6

WCFの "NetNamedPipes"トランスポートプロトコルは、同じマシンとプロセス間通信用に特別に設計されており、オーバーヘッドが最小限に抑えられています(高速バイナリシリアル化を含む)。

マーク

9

この記事では、ヌルトランスポートバインディングを確認します。

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

+0

ニースのアイデア、この実装は、しかし私のために動作しません、と私は 'NullChannelFactory \' 1.OnBeginOpen(TimeSpanのタイムアウト、AsyncCallbackコールバック、オブジェクトの状態) 'で' System.NotImplementedException'を取得します。このプロジェクトはオープンソースではないため、拡張して貢献するのは簡単ではありません。 –

関連する問題