我应该在Dispose()方法中调用GC.Collect()吗?

时间:2015-11-27 15:04:47

标签: c# garbage-collection dispose

我的示例代码:

using System;
namespace Program
{
    class Test : IDisposable
    {
        public long Loop()
        {
            for (int i = 0; i < 10000; i++)
            {
                var t = new Test();
            }
            return GC.GetTotalMemory(false);
        }
        public void Dispose()
        {
            GC.Collect();
        }
    }

    class MainClass
    {
        static void Main()
        {
            Console.WriteLine("Memory used: " + GC.GetTotalMemory(false));

            using (var t = new Test())
            {
                long size = t.Loop();
                Console.WriteLine("Memory used: " + size);
            }

            //object "t" and variable "size" cannot be re-used here
            //GC.Collect() should be called automatically

            Console.WriteLine("Memory used: " + GC.GetTotalMemory(false));
        }
    }
}

结果是:

  

使用的内存:29868

     

使用的记忆:160940

     

使用的内存:30712

如果我在GC.Collect()方法中移除Dispose,结果可能是:

  

使用的内存:29868

     

使用的记忆:160940

     

使用的记忆:160940

在运行GC.Collect()声明后,我不明白为什么using不会自动启动?

你能给我一个理由吗?

还有一个子问题:如果我想用GC.Collect()方法拨打Dispose,是否有必要?

1 个答案:

答案 0 :(得分:1)

dispose从不自动调用垃圾收集器,配置设计释放未管理的资源。垃圾收集器执行是在指定时间后运行的计划进程。

当您调用.Net垃圾收集器时,它会调用垃圾收集上对象的Object.Finalize方法以释放管理资源,这就是为什么您的内存使用次数显示较少的数字