2011-05-23 47 views

回答

3

不是直接。

但是,您可以添加终结器到您的一次性类中,并让终结器调用一个归因于[Conditional("DEBUG"]的方法,它们在命中时记录/抛出/通知您。这使您可以跟踪在调试时何时不在对象上调用Dispose()方法,但在部署时,只会像平常一样完成。

1

有没有好办法做到这一点。尽管我同意它会非常好,但Visual Studio缺少任何调试功能来跟踪尚未处理的IDisposable值。

在过去,当我希望使用这种类型的场景并且不想使用WinDbg + SOS时,我使用了一种手动跟踪的形式。本质上,它看起来像这样

static class Util { 
    private static List<WeakReference> _list = new List<WeakReference>(); 

    public static IEnumerable<IDisposable> Active { 
    get { return _list 
      .Select(x => x.Target) 
      .Where(x => x != null) 
      .Cast<IDisposable>(); } 
    } 

    [Conditional("DEBUG")] 
    public static void Track(IDisposable value) { 
    _list.Add(new WeakReference(value)); 
    if (_list.Count % 100 == 0)) { 
     _list.RemoveAll(x => x.Target == null); 
    } 
    } 
} 

现在我只是在我的IDisposable对象的构造函数调用添加到Util.Track,然后在运行时访问信息