我有一个.NET MVC站点,用于旋转子进程以进行后台工作。我希望确保在IIS启动新的应用程序域时关闭这些进程(例如部署或对Web.config进行任何更改)。
为此,我创建了一个CriticalFinalizerObject,如下所示:
public class ProcessHandle : CriticalFinalizerObject, IDisposable
{
private readonly int _processId;
private int _disposed;
public ProcessHandle(int processId)
{
this._processId = processId;
}
// dispose is called if we shut down the process normally, so
// we don't need to kill it here
public void Dispose()
{
if (Interlocked.Exchange(ref this._disposed, 1) == 0)
{
GC.SuppressFinalize(this);
}
}
~ProcessHandle()
{
if (Interlocked.Exchange(ref this._disposed, 1) == 0)
{
try
{
using (var process = Process.GetProcessById(this._processId))
{
process.Kill();
}
}
catch
{
}
}
}
}
每当我创建一个进程时,我都会存储一个ProcessHandle。希望是当新的应用程序域旋转时,IIS将卸载旧的应用程序域(在一些超时后)。这将为我的句柄运行终结器,这将终止任何进程。
但是,我观察到更改Web.config似乎不能可靠地导致终结器运行。我究竟做错了什么?还有另一种方法可以达到这个目的吗?
注意:我很乐意让子进程监视父进程,但我不控制子进程代码。我可以为此创建一个包装器进程,但我希望不需要额外的复杂层。