Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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# 动态系统。计时器。计时器和垃圾收集?_C#_.net - Fatal编程技术网

C# 动态系统。计时器。计时器和垃圾收集?

C# 动态系统。计时器。计时器和垃圾收集?,c#,.net,C#,.net,假设我动态创建一个计时器,如下所示: System.Timers.Timer expirationTimer = new Timer(expiration * 60000); expirationTimer.Elapsed += (sender, e) => removeExpiredCacheEntry(sessionID); expirationTimer.Start(); static void Main(string[] args)

假设我动态创建一个计时器,如下所示:

        System.Timers.Timer expirationTimer = new Timer(expiration * 60000);
        expirationTimer.Elapsed += (sender, e) => removeExpiredCacheEntry(sessionID);
        expirationTimer.Start();
static void Main(string[] args)
{
    SetTimer();
    Console.ReadLine();
}

private static void SetTimer()
{
    Timer expirationTimer = new Timer(1000);
    expirationTimer.Elapsed += (sender, e) => Notify(e);
    expirationTimer.Start();
}

private static void Notify(ElapsedEventArgs e)
{
    Console.WriteLine(string.Format("Notified! {0}", e.SignalTime));   
}
当该引用超出范围时,计时器对象是否会被垃圾收集?如果是这样的话,事件还会继续发生吗?如果不是,那么在这种情况下我如何避免内存泄漏


谢谢

一旦对象超出范围,并且没有对它的附加引用。它最终将被垃圾收集。但这可能暂时不会发生。因此,计时器可能会一直启动,直到它最终被垃圾回收

不过这只是一个猜测,因为我目前没有能力测试它

更新:

我刚刚编写了一个小测试程序,看起来像这样:

        System.Timers.Timer expirationTimer = new Timer(expiration * 60000);
        expirationTimer.Elapsed += (sender, e) => removeExpiredCacheEntry(sessionID);
        expirationTimer.Start();
static void Main(string[] args)
{
    SetTimer();
    Console.ReadLine();
}

private static void SetTimer()
{
    Timer expirationTimer = new Timer(1000);
    expirationTimer.Elapsed += (sender, e) => Notify(e);
    expirationTimer.Start();
}

private static void Notify(ElapsedEventArgs e)
{
    Console.WriteLine(string.Format("Notified! {0}", e.SignalTime));   
}
计时器持续启动了很长一段时间(我最终结束了程序)。有趣的是,我在main函数中插入了一个15秒的sleep,然后调用了
GC.Collect()
,并且即使在强制垃圾收集之后,计时器仍然保持运行,尽管不能保证调用
GC.Collect()
实际上会做任何事情

我还尝试将计时器包装在using语句中,这立即正确地禁用了计时器(没有在屏幕上打印任何内容)。所以,我相信我的假设是正确的,垃圾收集最终会收集计时器,并处理它。但是没有办法确定这将是什么时候。

根据,计时器对象确实有资格进行垃圾收集,并在某个时候停止触发事件

但是,垃圾收集是以另一种方式阻止的。如果我们有

publisher.SomeEvent += target.SomeHandler;

然后“publisher”将使“target”保持活动状态,但“target”不会使“publisher”保持活动状态。

谢谢!最后,我只是将计时器本身传递给事件处理程序,这样可以防止它被垃圾收集,并让我直接对其调用Dispose()。谢谢。很高兴有一个具体的答案。