2009-07-28 5 views

Antwort

8

Es ist für Sie getan. Betrachten Sie UnloadRecursive() von System.Web.UI.Control in Reflektor, die von ProcessRequestCleanup() aufgerufen wird.

+0

Thx Duncan, das ist der erste Beweis, den ich gesehen habe. –

5

Nein, Sie sollten Dispose nicht auf Steuerelementen aufrufen, das wird gerade ausgeführt. Sie sind verantwortlich für andere Einwegobjekte, die Sie außerhalb der Kontrollstruktur erstellen (FileStreams usw.).

Dies folgt aus einem allgemeinen .NET-Prinzip: Die Seite ist der Besitzer der Steuerelemente und daher erforderlich, um die (explizite) Dispose an sie zu kaskadieren. Für den eigentlichen Code müssen Sie den Code für Web.UI.Control reflektorieren.

+0

Ich zweifle nicht, dass Sie richtig sind. Ich versuche, jemand anderen zu überzeugen, und würde mich über alle Hinweise freuen, die Sie vielleicht kennen würden. –

+0

Ich denke, der beste Beweis in diesem Fall ist der Mangel an Artikeln darüber, wie Sie Ihre Steuerelemente aufräumen (-: Aber ich werde ein wenig bearbeiten. –

+0

Henk ist richtig. Weder Sie noch "jemand anderes" hat einen Artikel von Microsoft gesehen auf ASP.NET, die jede "dispose loop" hat. Das ist, weil es nicht benötigt wird. –

2

Dieser Artikel auf The ASP.NET Page Life Cycle heißt es:

„Unload aufgerufen wird, nachdem die Seite vollständig gerendert wurde, an den Client gesendet, und bereit ist, verworfen wird an dieser Stelle Seiteneigenschaften wie Antwort und Anfrage. werden entladen und jede Bereinigung wird durchgeführt. "

Ich würde nehmen, dass "jede Reinigung" bedeutet die Beseitigung von Kontrollen usw. Ich kann mir nicht vorstellen, dass die Designer des ASP.NET-Framework das übersehen hätten und niemand hätte es bemerkt.

1

Interpretiert anders, es gibt mehr Komplexität für diese Frage als das Auge trifft.

Sicher Disposed wird aufgerufen, aber tut es alles? Es kommt darauf an.

Wenn Sie das Disposed Ereignis einer Seite oder eines Steuerelements abonniert haben und darauf warten, dass es pro Anfrage aufgerufen wird, könnten Sie eine Überraschung erleben. Ja, technisch ProcessRequestCleanup() Sprechen nennt es für Sie, aber haben Sie einen Blick auf das, was es nennt tatsächlich:

public virtual void Dispose() 
{ 
    IContainer service = null; 
    if (this.Site != null) 
    { 
     service = (IContainer) this.Site.GetService(typeof(IContainer)); 
     if (service != null) 
     { 
      service.Remove(this); 
      EventHandler handler = this.Events[EventDisposed] as EventHandler; 
      if (handler != null) 
      { 
       handler(this, EventArgs.Empty); 
      } 
     } 
    } 
    if (this._occasionalFields != null) 
    { 
     this._occasionalFields.Dispose(); 
    } 
} 

Ohne eine Entwurfsoberfläche dieser Code im Wesentlichen tut nichts zur Laufzeit, was bedeutet, Ihre Disposed Handler wird nie ausgeführt.

Lektion ist nicht auf Disposed Handler angewiesen, um pro Anfrage auszuführen. Sie können es überschreiben, um sicherzustellen, dass etwas ausgeführt wird, aber Unloaded ist eine viel sicherere Wette.