调试对象无法完成?

时间:2012-05-02 12:57:44

标签: c# debugging finalizer

我的应用程序中有以下代码,以帮助我检查ViewModel是否正确完成:

#if DEBUG
    static int openViewModels = 0;

    protected AbstractViewModel()
    {
        openViewModels++;
    }

    ~AbstractViewModel()
    {
        openViewModels--;
        System.Diagnostics.Debug.WriteLine(openViewModels);
    }
#endif

我的应用程序中的所有viewModel都派生自此类。我发现随着时间的推移,openViewModels会增加,这意味着某些viewModel无法最终确定。

我无法弄清楚为什么会这样 - 我盯着我的代码,但我看不出是什么导致一些物体留下来。是否有任何工具或程序可以帮助我找出阻止这些对象最终确定的内容?

2 个答案:

答案 0 :(得分:5)

首先,这是开放的线程;应为Interlocked.Increment(ref openViewModels)Interlocked.Decrement(ref openViewModels)

其次,最终确定是非确定性的。除非你强迫它,否则你不应该强迫它。您不应期望它们在任何特定时间范围内进行清理,尤其是在您有大量可用内存的情况下。最终确定是记忆压力的一个因素。

答案 1 :(得分:3)

不保证最终确定对象。如果您需要可靠的最终确定,则应实施IDisposable