C# 为什么';当一个新的应用程序域启动时,我的CriticalFinalizerObject不会被终结吗?
我有一个.NETMVC站点,它可以启动子进程来做后台工作。我想确保当IIS启动一个新的应用程序域时(例如,在部署或对Web.config进行任何更改时),这些进程都会关闭 为此,我创建了一个CriticalFinalizerObject,如下所示:C# 为什么';当一个新的应用程序域启动时,我的CriticalFinalizerObject不会被终结吗?,c#,iis,process,finalizer,C#,Iis,Process,Finalizer,我有一个.NETMVC站点,它可以启动子进程来做后台工作。我想确保当IIS启动一个新的应用程序域时(例如,在部署或对Web.config进行任何更改时),这些进程都会关闭 为此,我创建了一个CriticalFinalizerObject,如下所示: public class ProcessHandle : CriticalFinalizerObject, IDisposable { private readonly int _processId; priv
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似乎不能可靠地使终结器运行。我做错了什么?有没有其他方法可以做到这一点
注意:我希望让子进程监视父进程,但我不控制子进程代码。我可以为此目的创建一个包装进程,但我希望不需要额外的复杂性。我不想在Finalizer中终止该进程。@MatteoSp否则,该进程会在应用程序重新启动后挂起。最终,系统中充满了没有做任何事情的进程,但谁(或什么)应该处理您的“ProcessHandle”实例?@MatteoSp:据我所知,关键的FinalizerObject在应用程序关闭时被最终确定(当然不是stackoverflow或类似的事情),因此您有代码强制关闭进程,您希望在进程关闭时调用此代码吗?伙计,你真的需要澄清一下你期望发生的事情,我真的不明白。