Как в C# класс может выполнить свою собственную финализацию в конце приложения таким образом, чтобы он работал как в ASP.Net, так и в не-веб-приложениях?

У меня есть библиотечный класс, используемый в ASP.Net и не-веб-приложениях, который требует финализации в конце приложения.

В библиотеке моего проекта я хочу, чтобы класс выполнял свою собственную финализацию приложения, не требуя от разработчика добавления вызова Global.Application_End или AppDomain.CurrentDomain.ProcessExit.

Как это может быть сделано?

Дополнительная информация/обоснование:

Даже если бы я рассмотрел эти варианты, оказалось, что AppDomain.CurrentDomain.ProcessExit не вызывается, когда приложение ASP .Net останавливается в IIS. И Global.Application_End специфичен для ASP .Net. Таким образом, ни один из вариантов не совместим с обеими ситуациями.

Если это поможет иметь конкретный пример того, почему это может быть необходимо... В этом конкретном случае он использует SqlDependency, который (как я понимаю) требует вызова SqlDependency.Start для инициализации и вызова SqlDependency.Stop перед приложением прекращение.

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


person BrianCooksey    schedule 07.11.2013    source источник
comment
В общей библиотеке классов?   -  person Mike Perrenoud    schedule 13.11.2013
comment
Вы не можете защититься от всех непредвиденных обстоятельств - в конце дня кто-то может подойти к машине и выдернуть ее вилку из стены - чтобы библиотека потребитель указывала, когда они закончили использование библиотека (либо в Application_End, либо где-либо еще, что имеет смысл для не-веб-приложения) будет более чистым общим решением, чем попытка волшебным образом обнаружить сценарии завершения работы.   -  person Damien_The_Unbeliever    schedule 13.11.2013
comment
Да, это общая библиотека.   -  person BrianCooksey    schedule 13.11.2013
comment
Не беспокойтесь о каждом непредвиденном обстоятельстве – ищите стандартный набор сценариев завершения/выхода процесса/приложения.   -  person BrianCooksey    schedule 13.11.2013
comment
Я разместил ответ, который работает ниже, но меня интересуют и другие работоспособные решения.   -  person BrianCooksey    schedule 13.11.2013


Ответы (1)


Похоже, что смоделированный статический анализатор, описанный в этом S.O. answer, https://stackoverflow.com/a/256278/449837, работает как в веб-приложениях, так и в других.

Вот пример, который у меня работает:

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
}

(ПРИМЕЧАНИЕ. Для некоторых сред блокнота кода, таких как LinqPad, ~Finalizer может не запускаться, пока само приложение блокнота не закроется)

person BrianCooksey    schedule 13.11.2013