这是内存泄漏还是垃圾收集修复它

Jon*_*Jon 4 .net c# performance garbage-collection memory-leaks

让我们说我有一个点击按钮,它执行此操作:

public void ButtonClick(object sender, EventArgs e)
{
  System.Timers.Timer NewTimer = new System.Timers.Timer();
  NewTimer.AutoReset = false;
  NewTimer.Elapsed += new ElapsedEventHandler(TimerElapsed);
  NewTimer.Interval = 1000;
  NewTimer.Start(); 
}

public void TimerElapsed(object sender, ElapsedEventArgs e)
{

}
Run Code Online (Sandbox Code Playgroud)

如果单击此按钮100次,那么已创建的实例会发生什么?垃圾收集会启动还是System.Timers.Timer.Close方法需要调用,如果它在哪里,你从哪里调用它?

Jar*_*Par 5

不,这不会导致内存泄漏.实际上,编写代码的方式并不能保证正确执行. Timers.Timer它实际上只是一个包装器Threading.Timer,它被明确列为可收集的,即使它当前正在运行.

http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx
Run Code Online (Sandbox Code Playgroud)

在这里你没有提及它,因此下一个GC可以在你的表格仍在运行时以及在事件发生之前收集它

编辑

文档Timers.Timer似乎不正确.如果Timer实例未被引用,则不会收集该实例.它确实会继续存在

var timer = new System.Timers.Timer
{
    Interval = 400,
    AutoReset = true
};
timer.Elapsed += (_, __) => Console.WriteLine("Stayin alive (2)...");
timer.Enabled = true;

WeakReference weakTimer = new WeakReference(timer);
timer = null;

for (int i = 0; i < 100; i++)
{
    GC.Collect();
    GC.WaitForPendingFinalizers();
}

Console.WriteLine("Weak Reference: {0}", weakTimer.Target);
Console.ReadKey();
Run Code Online (Sandbox Code Playgroud)