6

私は興味深いデザインの問題を抱えており、皆さんがいくつかの提案をしてくれることを望んでいました。C#と.NET3.0を使用しています

エンドポイントのセットアップとコントラクトの作成を自動化する、WCF上に構築された非常に優れた拡張可能なフレームワークがあります。私が作業しているシステムは、さまざまな方法で実行できます。エンドポイントは、インターネット上の別の場所にあるか、同じボックスのさまざまなアセンブリで実行されているか、同じプロセスで実行されている可能性があります。WCFは、これらすべてを透過的にするのに最適ですが、最後のケースでは、効率を向上させたいと思います。

実際にはどこにも行かないオブジェクトをシリアル化するオーバーヘッドを避けたいと思います。同じアセンブリ内の2つのスレッド間で通信するためにそれを行うことには実際には意味がありません。同時に、システムのセットアップに応じて2つの別個の通信経路がない場合、保守がはるかに簡単になるため、すでに導入されているWCFベースのフレームワークを利用したいと思います。

私の最初の考えは、安全でないコンテキストでオブジェクトポインターを使用することでした。つまり、シリアル化と戦うのではなく、最小限の量だけをシリアル化することでした。これに関する私の懸念は、GCが積極的である環境での非同期メッセージでは、メッセージに含まれるポインターを逆参照する機会が得られる前にメッセージが消える可能性があり、おそらく消えてしまうため、多くの問題が発生する可能性があります。

私の次の考えはGCHandlesを使用することでしたが、それらの動作についてはよくわかりません-GCHandleがもう参照されていないが、管理対象オブジェクトへの参照が含まれている場合、両方ともGCによってクリーンアップされますか、それともどちらでもありませんか?メッセージが失われる可能性が高く、Free()を呼び出すことができず、見つけたドキュメントが不足しているため、これらを使用して大量のメモリリークが発生するのではないかと心配しています。 。

もう1つの考えは、リフレクションを使用してすべての管理対象オブジェクトを調べることですが、これには大きなオーバーヘッドがかかるようであり、このシステムは可能な限り効率的である必要があります。

したがって、要約すると、シリアル化せずにWCFを使用してプロセス全体にオブジェクトを送信しようとしています。これは、一時的に参照がない場合でも、オブジェクトを存続させることを意味します。可能だと思いますが、ケーキを食べて食べようとしているのではないでしょうか。

ご入力ありがとうございます!

4

2 に答える 2

9

この記事の null トランスポート バインディングを確認してください。

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

于 2009-03-08T09:49:48.960 に答える
6

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

マーク

于 2009-03-07T08:47:51.800 に答える