具有非托管静态实例的静态类的最佳模式是什么?

时间:2014-01-11 06:14:58

标签: c#

考虑以下伪代码。

static class Tools
{
    static readonly UnmanagedType ut = new UnmanagedType ();
}

此方案的最佳模式是什么,以便可以保证在应用程序退出后立即将非托管静态实例释放到系统中?

我的粗略想法是在Tools类中ut实例化后立即强制订阅Tools处理方法到系统的关闭事件。可能吗?怎么样?

2 个答案:

答案 0 :(得分:4)

的Singleton?

sealed class Tools
{
    public static readonly Tools Instance = new Tools();

    private UnmanagedType ut = new UnmanagedType ();

    ~Tools() {
      // TODO: destroy this.ut
    }
}

答案 1 :(得分:0)

我已经看到了类似问题的几个答案(即“一旦进程退出,如何在静态类中释放/处置对象/资源”)。所有的答案基本上都是这样的 a)C#中的静态类不能有析构函数(这是正确的), b)因此你不能在静态课堂生活结束时释放资源, c)因此,您必须将您的类转为非静态以处置/释放对象/资源。

我不同意b)和c)项,并建议以下解决方案在退出时将对象置于静态类中:

  1. 在静态类构造函数中或对其创建要处置的对象的方法的任何第一次调用:

    a)保存主进程线程引用(Thread.CurrentThread);
    b)启动一个新线程( Watcher ),监视主线程是否正在运行。

  2. 主线程终止后, Watcher 会处置/释放对象/资源并退出。
  3. 示例代码:

    using System.Threading;
    
    public static class StaticDisposer 
    {
        private static Thread mParentProcThread = null;
        private static Thread mDisposerThread = null;
      // Other class members:
            ………………………………………………
    
      // Objects to be disposed at the process exit:
      // Ex.: private/public static … obj1ToDispose = null;
            ………………………………………………
    
        static StaticDisposer()
        {
             mParentProcThread = Thread.CurrentThread;
             mDisposerThread = new Thread(DisposerThreadBody);
             mDisposerThread.Start();
        }
    
      // Methods of the class:
            ………………………………………………
    
        private static void DisposerThreadBody()
        {
            while (mParentProcThread != null && mParentProcThread.IsAlive)
            {
                Thread.Sleep(500);
            }
            // Dispose objects, release resources, close streams, delete temporary files, etc.:
            //if(obj1ToDispose != null)
            //    <Dispose code>
            //   ………………………………………………………………………………
        }
    
    }
    

    NB!如果您的程序中有多个线程正在使用带有建议的处理逻辑的静态类,并且您希望仅在主线程停止时才进行处理,那么主线程必须在辅助线程之前调用/ set /获取静态类的任何方法/属性。