Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关于GC和事件处理程序的问题_C#_.net_Garbage Collection - Fatal编程技术网

C# 关于GC和事件处理程序的问题

C# 关于GC和事件处理程序的问题,c#,.net,garbage-collection,C#,.net,Garbage Collection,可能的重复项: 如果我有以下代码: public void SomeMethod() { Timer timer = new Timer(); timer.Tick += new EventHandler(timer_Tick); timer.Start(); } 在SomeMethod完成后,即使在任何地方都没有对计时器的引用,timer\u Tick是否会继续重复调用 我在想,在调用计时器的Dispose方法之前,它可能会。但是,一般来说,GC知道什么时候没有处理

可能的重复项:

如果我有以下代码:

public void SomeMethod()
{
    Timer timer = new Timer();
    timer.Tick += new EventHandler(timer_Tick);
    timer.Start();
}
SomeMethod
完成后,即使在任何地方都没有对计时器的引用,
timer\u Tick
是否会继续重复调用


我在想,在调用计时器的Dispose方法之前,它可能会。但是,一般来说,GC知道什么时候没有处理对象吗?

GC将在下一次爬网时收集它。。。它和其他物体一样。
计时器引用的是事件,而不是实例的事件,因此它将是GC'd。

任何地方的代码都不会包含对
计时器的引用;因此,它将有资格进行垃圾收集


timer
对象本身有一个对
timer\u Tick
方法的引用,但这并不重要。它仍然可以被收集。

与这里的其他答案相反,不,计时器不会被垃圾收集

在内部,启用计时器将分配一个
GCHandle
对象,该对象将保持对象、计时器以及任何具有实现事件处理程序的对象处于活动状态,直到您禁用它或程序结束,以先到者为准


这已经在这里得到了回答,所以我将以重复的形式结束这个问题。

System.Windows.Forms.Timer
System.Web.UI
打勾
。这有关系吗
System.Windows.Form.Timer
。但我只是把它作为一个样本。我想大致了解一下它是如何工作的。我相信它是System.Windows.Forms.Timer,因为这是唯一一个名为Tick的事件。(afaik)总的来说,我同意,因为所有计时器的行为都不同,所以没有办法回答这个问题。尽管如此,由于他在评论中特别提到了其中一个计时器,我还是以重复的方式结束了。@jsoldi请不要再问所有计时器,它们的行为都不同,所以如果你问这个问题,它将以非真实问题的方式结束,正如@Henk所说。由于您特别提到System.Windows.Forms one,因此我将您的问题作为该计时器的答案的副本关闭。这里还有其他问题以及其他计时器的答案,至少Dispatchermer有一个。这不一定会停止计时器,但可能会导致异常,具体取决于
计时器的设计方式。管理式垃圾收集有点糟糕。