在我的WCF服务中,我使用静态字典来保存一些资源密集型数据。我需要在应用程序池被回收时清理资源。是否有任何方法(例如事件)可以检测到应用程序池正在被回收?
答案 0 :(得分:0)
如果您的应用程序池被回收,则将重置所有静态对象。您可以在创建静态字典的实例时清除所有外部资源(如文件或...)。像这样的东西:
public static partial class ProjectValues
{
public static ConcurrentDictionary<string, string> MessageDictionary { private set; get; }
static ProjectValues()
{
try
{
MessageDictionary = new ConcurrentDictionary<string, string>();
//then clear the resource here
}
catch (Exception ex)
{
return;
}
}
}
答案 1 :(得分:0)
是否有任何方法(例如事件)可以检测到它 应用程序池正在回收?
有点儿。
根据Phill Haack,IIS公开了一个名为HostingEnvironment.RegisterObject的静态方法,它允许您将IRegisteredObject的实现传递给它。
理论上,这会告诉IIS在决定杀死正在运行的应用程序的w3wp.exe进程之前调用IRegisteredObject.Stop操作。
我在理论上说,因为这种方法不是故障安全的,并且有些情况下,AppDomain可以在没有调用,甚至调用但随后在您完成清理之前关闭的情况下消失。