そのアイデアあるいは静的解析ルール(FXCop)このイベントの代表者を除去し
-
21-08-2019 - |
質問
いう大きなメモリリークを解析した要因の一つとなっての除去に委譲のイベントがオブジェクトはGCed迅速に(または永遠に).
ば誰でもそのアイデアとしての書き方原則にFXCopのための代表者から取り除かれるハンドラ?
私は見る この してまいります。
解決
Ok横に問題の実施、実際のチェック(私の意見も同じよる 道路 は、このような実践)-ここでは、新FxCopルール:
最初は一部の記事の感度:
実施の簡単なルールがなければならない。お客様のプロジェクトが必要Rules.xml ファイルとして組み込み資源を参照 こちらの).するクラスから BaseIntrospectionRule
追加コードをチェック方法:
public override ProblemCollection Check( TypeNode typeNode )
{
if( type.IsPublic )
{
Problems.Add( new Problem( ... ) );
}
return Problems;
}
かったことにある。あなたにとってどんな年でしたように、ほとんどの記述:)
他のヒント
あなたはより具体的にする必要があります。一般的な場合には、加入者が出版社より短い寿命が住んでいるので、あなたは、すべてのイベント参加者は退会したことを確認する必要はありません。あなたの加入者が出版社より長い寿命のように表示されたときやメモリリークが起きるだけで、それゆえ出版物の収集からGCを防ぐ参照がある。
今、私たちは、あなたが比較的短い住んでいるオブジェクトのイベントを購読している場合、あなたは最終的にそれから退会することを確認する必要があります。
私はこの場合には思い付くことができるヒューリスティック:(現在のコードブロック{}によってスコープされる)すべてのローカル変数オブジェクトと明示的に廃棄するすべてのオブジェクトを分析します。これらのオブジェクトのすべてのイベントのためにあなたがそれらに加入した回数と、あなたが退会た回数をカウントします。最初の番号が大きければ、警告を発する。
は、すべてのケースをカバーしますが、私は、静的なアプローチは、この問題ですべてのケースをカバーすることはできません推測していませんもちろん、あなたは十分に良いですいくつかの方法が必要になります。
の私は、それは別のトピックであるとの質問に関連していない、ここでレビュー動的解析とコードの利点には言及しています。の
あなたはすべてのイベント・サブスクリプションはWeakReferencesによって処理されなければならないルールを強制することはできますか?私は、これはあなたのプログラムの実際の流れを分析するよりも実装が簡単であるべきと思っています。
は、ハンドラを実装するオブジェクトは何とかイベントを持つオブジェクトへの参照のバックを持っていると仮定することは安全ですか?その場合は、あなたはサイクルに別の道を破る方法を考え出す方がいいでしょう。
私たちは、ASP.NETページのイベントハンドラでしばらく前に行くと同様のものを持っていました。ハンドラを実装するオブジェクトもページへの参照を持っていました。 architectually私たちはできる限りのリンクの多くを破壊した後、いくつかの左オーバーはWeakReferencesに変更しました。より多くのメモリの問題ありません!