为什么我的CriticalFinalizerObject在新的应用程序域旋转时不能最终确定?

时间:2015-05-06 18:14:31

标签: c# iis process finalizer

我有一个.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似乎不能可靠地导致终结器运行。我究竟做错了什么?还有另一种方法可以达到这个目的吗?

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

0 个答案:

没有答案