Alle Ideen, wie eine statische Analyseregel (FXCop) zu schreiben, das Ereignis Delegierten, um sicherzustellen, werden entfernt

StackOverflow https://stackoverflow.com/questions/854716

Frage

Wir haben durch ein großes Speicherleck Analyse gegangen und haben einen der Faktoren gefunden hat, die nicht die Entfernung von Delegierten auf Ereignisse gewesen Objekte verursacht nicht GCed schnell genug (oder manchmal auch für immer) sein.

Würde jemand eine Idee hat, wie eine Regel in FXCop zu schreiben, um sicherzustellen, dass wir Teilnehmer aus Handler entfernt werden?

Ich habe gerade gesehen diese und als solche I‘ für weitere Informationen fragen dort werde.

War es hilfreich?

Lösung

Ok, neben dem Problem der die tatsächliche Kontrolle der Umsetzung (meiner Meinung nach ist dies sehr ähnlich zu einem Pfad rel="nofollow Abdeckung und damit nicht praktikabel) - hier ist der Weg, eine neue FxCop Regel, es zu schreiben:

Zunächst einige Artikel, die mir einmal geholfen:

eine einfache Regel Implementierung ist keine große Sache. In Ihrem Projekt benötigen Sie eine rules.xml Datei als eingebettete Ressource (siehe hier ). Sie leiten Ihre Klasse von BaseIntrospectionRule und fügen Sie den Code zum Check () - Methode:

public override ProblemCollection Check( TypeNode typeNode )
{
  if( type.IsPublic )
  {
    Problems.Add( new Problem( ... ) );
  }
  return Problems;
}

Ich tat dies vor einiger Zeit. Ich hoffe, es funktioniert immer noch wie beschrieben:)

Andere Tipps

Sie müssen präziser sein. Sie brauchen nicht zu prüfen, ob alle Ereignisse Delegierten waren unsubscribed, weil in einem gemeinsamen Fall ein Teilnehmer kürzeres Leben lebt als ein Verlag. Und ein Speicherverlust geschieht nur, wenn der Teilnehmer als ein Verlag langlebigeren zu sein scheint, daher gibt es eine Referenz, die GC verhindern, dass das Sammeln des Verlegers Objekt.

Jetzt müssen wir das überprüfen, ob Sie zu einer Veranstaltung auf ein relativ kurzlebiges Objekt abonnieren Sie Austragen es schließlich.

Eine Heuristik mit dem ich in diesem Fall kann kommen: analysiert alle lokalen Variablen Objekte und alle Objekte, die Sie explizit Dispose (die vom aktuellen Codeblock {} scoped ist). Für jedes Ereignis auf diesen Objekten, die zählen, wie oft Sie sie und die Anzahl der abonnieren Sie abmelden. Wenn die erste Zahl größer ist dann eine Warnung aus.

Das ist natürlich nicht alle Fälle abdeckt, aber ich denke, kein statischer Ansatz, alle Fälle in diesem Problem decken kann, müssen Sie eine Methode, die gut genug ist.

Ich werde nicht die Vorteile der dynamischen Analyse erwähnen und Code Reviews hier, wie es ein anderes Thema ist, nicht auf die Frage bezogen.

Können Sie eine Regel erzwingen, dass alle Ereignisabonnements sollten durch WeakReferences umgegangen werden? Ich denke, dies sollte einfacher sein, als zu implementieren, die den tatsächlichen Ablauf Ihres Programms zu analysieren.

Ist es sicher, mit den Ereignissen auf das Objekt zu übernehmen, die Objekte der Umsetzung der Handler irgendwie Referenzen zurück haben? Wenn das der Fall ist bist du besser dran, herauszufinden, wie der Zyklus einer andere Art und Weise zu brechen.

Wir hatten etwas ähnliches auf einer Weile zurück mit Event-Handler auf ASP.NET-Seiten. Die Objekte, die die Handler implementiert hatten auch Verweise auf die Seiten. Nach dem Bruch, da viele der Links architectually, wie wir konnten, die wenige linken overs wurden WeakReferences geändert. Keine Probleme mit dem Speicher!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top