程序中有单实例的实现方式,在窗口关闭重新打开后发生错误,提示错误:无法访问名为"XYZ"的已处置对象。
此问题原因已找到,因为对象已标记为释放但是还未释放,致使访问的条件不成立;参考文件如下:
http://topic.csdn.net/t/20051224/15/4479124.html修改判断条件if (instance == null)为if (instance == null || instance.IsDisposed)后问题解决了。但是又发现另一个没办法解决的问题:
有一个单实例对象A可以被另外两个对象X,Y访问到,在X访问时发现其已标记为释放所以生成了一个新对象,当Y访问时其已存在所以没有再次生成新对象,但是当Y访问该单实例对象时仍然得到一个错误:无法访问名为"XYZ"的已处置对象,X访问该单实例对象时正常。
请假高手这是什么原因?这个问题应该怎么解决?

解决方案 »

  1.   

    既然是单实例,那么在整个程序退出之前就不应该被销毁,检查你的代码,去掉所有销毁该对象的代码,如果是窗体,则改为隐藏,而不要Close或Dispose.
      

  2.   

    类A是UserControl自定义控件,我没有修改它的Dispose方法;
    实际上我没有直接调用Close或Dispose的方法,我只是将它们从父控件上清理出去而已Controls.Clear();
    另外类X,Y也是单实例模式;说了这么多,好像我使用单实例是错误的,自定义控件作为控件的话,我还没见过将一个窗口上的控件移动到另一个窗口上这样的做法!!我想这里我应该去修改一下。另外我还想知道我遇到的是什么问题!?X,Y都是通过类A访问它的静态属性,为什么一个能访问到,另一个访问不到哪?
      

  3.   

    to ls:我的程序内没有使用多线程,当然生成对象的时候也不用考虑锁定。
      

  4.   

    如果是单实例的话, 你的singleton写得是否正确呢?
    public class MyStaticClass
    {
            private static MyStaticClass Instance; 
            private MyStaticClass()  //普通构造器。定义成私有的。
            {
              
            }   
     
            public static MyStaticClass GetInstance()
            {
                      if (Instance == null)
                     {
                             Instance = new MyStaticClass();
                     }   
                     return Instance;  
            }
    }
      

  5.   

    添加互斥看看行不行。记得有一本设计模式的书里有这样的详解。
            public static MyStaticClass GetInstance()
            {
                     System.Threading.Monitor.Enter(Instance)
                     if (Instance == null)
                     {
                             Instance = new MyStaticClass();
                     }   
                     System.Threading.Monitor.Exit(Instance)
                     return Instance;  
            }
      

  6.   

    问题原因难以想象;
    我已经想办法绕过此问题;
    noky(孤狼傲血)的方法还没有去试验。