1

これは、すでにを使用している既存のアプリケーション用であるため、ラップアラウンドしてAwesomium、コードの残りの部分をNETにできるだけ近づけようとしています。WebBrowserWebBrowser

このライブラリにはJSObject、javascriptオブジェクトを表すというクラスがあります。たとえば、クラスのExecuteJavascriptWithResultメソッドを呼び出すことで、このいずれかを取得できます。のようにWebView呼び出すと、ドキュメントを表すが表示されます。myWebView.ExecuteJavascriptWithResult("document", string.Empty).ToObject()JSObject

と呼ばれる不変のクラス(フィールドはreadonly JSObjectオブジェクトのみ)を作成しています。このクラスJSObjectWrapをラップアラウンドして、やJSObjectなどの.NETクラスをエミュレートする他のクラスの基本クラスとして使用します。現在、これらのクラスは実装していませんが、実装しています。私が最初に考えたのは、(実装する代わりに)ファイナライザーで基になる'メソッドを呼び出して、コードの残りの部分を(どこにでも追加して、すべてが適切に処分されている)。HtmlElementHtmlDocumentDisposeJSObjectJSObjectDisposeJSObjectWrapJSObjectWrapDisposeusingJSObjectWrap

しかし、2つ以上がJSObjectWrap同じ基礎JSObjectを持ち、そのうちの1つが完成すると、もう1つが台無しになることに気づきましたJSObjectWrap。だから今、私は多分私がそれらのそれぞれが参照されているものの静的な数を数えDictionary続けるべきだと思っていますが、これは厄介に聞こえ、大きなパフォーマンスの問題を引き起こす可能性があると思います。JSObjectsJSObjectWrap

これは私には一般的なパターンのように聞こえるので、他の誰かがより良いアイデアを持っているのだろうかと思います。

4

2 に答える 2

1

2つ以上のJSObjectWrapが同じ基になるJSObjectを持っている場合、JSObjectを参照する3つ以上の参照があるため、参照カウントが0に達するまでガベージコレクションされません。何かが足りませんか?

コメント後に編集:

Ok。わかった。あなたがしたいのは、JSObjectを共有できるようにすることですが、誰かがそれを参照している限り、それを破棄したくないのです。私には、JSObjectsの辞書を保持することによってあなたが提案したものが唯一の方法のようです。並列を描画するために、これは.NET / JVMが共有される不変の文字列に対して行うことと非常に似ていますが、唯一の違いは、この例では、参照カウントがゼロでない限り、ここで文字列のガベージコレクションを意味します(辞書が維持されていない限り、推測を決定することはできません)、文字列はガベージコレクションの対象にはなりません。

于 2012-07-04T03:14:41.227 に答える
1

user1168577の回答をフォローアップするには、もちろん、ラッパーとラップピーの間に1対1の関係があるようにシステムを設定することができます。次に(継承よりも構成を優先します)、必要に応じて、ライブラリクラスに同じラッパークラスへの参照を保持させます。その後、ガベージコレクターはその魔法を実行できます。

しかし、そうすることはおそらくあなたの時間を無駄にします。IDisposable実装者の標準パターンは、以前に呼び出されていなかった場合、ファイナライザーでDisposeを呼び出します。JSObjectをILSpyなどで逆コンパイルして、これが行われることを確認します。もしそうなら、それを行うコードを書く必要はありません!

ラッパーライブラリが新しいコードに使用されないことが確実な場合は、IDisposableを実装する必要はありません。その場合は、インターフェイスを実装しますが、理由で変更する必要がない限り、レガシーコードでDisposeの呼び出しを省略できるようにします。

于 2012-07-04T03:46:39.433 に答える