Wie kann eine Klasse in C#ihre eigene Anwendungsendefinschließung auf eine Weise durchführen, die sowohl unter ASP.NET- als auch unter Anwendungen ohne Web funktioniert?

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

Frage

Ich habe eine Bibliotheksklasse, die in ASP.NET- und Nicht-Web-Anwendungen verwendet wird, die die End-of-Application-Finalisierung benötigen.

In der Bibliothek meines Projekts möchte ich, dass die Klasse ihre eigene End-of-Application-Finalierung durchführt, ohne dass ein Entwickler einen Aufruf zu global.application_end oder Appdomain.CurrentDomain.Processexit hinzufügen muss.

Wie kann das getan werden?

Zusätzlicher Hintergrund/Begründung:

Selbst wenn ich diese Optionen in Betracht ziehen würde, scheint es, dass AppDomain.currentDomain.Processexit nicht aufgerufen wird, wenn eine ASP .NET -Anwendung in IIS gestoppt wird. Und Global.Application_end ist spezifisch für ASP .net. Keine Option ist also mit beiden Situationen kompatibel.

Wenn es hilft, ein spezifisches Beispiel dafür zu haben, warum dies möglicherweise benötigt wird ... in diesem speziellen Fall verwendet es SQLdePendency, das (wie ich es verstehe) einen Aufruf an sqldependency.Start für die Initialisierung und einen Aufruf an sqldependency.stop vor der Anwendung erfordert Beendigung.

(sehen http://msdn.microsoft.com/en-us/library/ms172133.aspx)

War es hilfreich?

Lösung

Es scheint, dass ein simulierter statischer Fianalisator, der in dieser Antwort beschrieben wurde, https://stackoverflow.com/a/256278/449837, arbeitet sowohl in Web- als auch in Nicht-Web-Anwendungen.

Hier ist ein Beispiel, an dem ich gearbeitet habe:

public class ClassThatNeedsStaticFinalizer {

    // ... other class properties, methods, etc ...     

    #region Static Finalizer Emulation

    static readonly Finalizer finalizer = new Finalizer();
    private sealed class Finalizer
    {
        ~Finalizer()
        {
             //  ... Do final stuff here ...
        }
    }

    #endregion
}

(Hinweis: Für einige Code -Scratchpad -Umgebungen wie Linqpad kann ~ Finalizer erst abgefeuert werden, wenn die Scratchpad -App selbst schließt.

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