C# 为什么';当一个新的应用程序域启动时,我的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

我有一个.NETMVC站点,它可以启动子进程来做后台工作。我想确保当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似乎不能可靠地使终结器运行。我做错了什么?有没有其他方法可以做到这一点


注意:我希望让子进程监视父进程,但我不控制子进程代码。我可以为此目的创建一个包装进程,但我希望不需要额外的复杂性。

我不想在Finalizer中终止该进程。@MatteoSp否则,该进程会在应用程序重新启动后挂起。最终,系统中充满了没有做任何事情的进程,但谁(或什么)应该处理您的“ProcessHandle”实例?@MatteoSp:据我所知,关键的FinalizerObject在应用程序关闭时被最终确定(当然不是stackoverflow或类似的事情),因此您有代码强制关闭进程,您希望在进程关闭时调用此代码吗?伙计,你真的需要澄清一下你期望发生的事情,我真的不明白。