2013-11-07 2 views
1

У меня есть класс библиотеки, используемый в ASP.Net и не-веб-приложениях, которые нуждаются в окончательной доработке приложения.В C#, как класс может выполнить свою собственную завершение конца приложения таким образом, который работает как в 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)

+0

В библиотеке классов, что это общий? –

+1

Вы не можете защищаться от любых непредвиденных обстоятельств - в конце дня кто-то может перейти к машине и вытащить ее вилку из стены - если потребитель библиотеки * укажет, когда они закончили использовать библиотеку (в либо Application_End, либо там, где это имеет смысл для не-веб-приложения) будет более чистым общим решением, чем попытка «волшебным образом» обнаружить сценарии выключения. –

+0

Да, это общая библиотека. – BrianCooksey

ответ

1

Оказывается, что моделируемый статический fianalizer описанный в этом С.О. 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, ~ Финалайзер может не сработать, пока сам блокнотная приложение закрывается)

Смежные вопросы