gpt4 book ai didi

c# - 启用 System.Timers.Timer 和 GarbageCollector

转载 作者:行者123 更新时间:2023-11-30 22:20:33 25 4
gpt4 key购买 nike

在我的项目中,我创建了 System.Timers.Timer 对象并将时间间隔设置为 10 分钟。每 10 分钟我就会收到一个 elapsed 事件。在这个事件处理程序中,我正在执行一些代码。

在执行此代码之前,我将 Enabled 属性设置为 false,因为如果处理程序的执行时间比下一个间隔长,则另一个线程将执行经过的事件。

这里的问题是 Elapsed 事件突然停止。

我已经阅读了一些文章并怀疑 moment enabled 属性设置为 false garbagecollector 释放了计时器对象。

如果正确请告诉我解决方法。

示例代码如下:

public class Timer1
{
private static System.Timers.Timer aTimer;

public static void Main()
{
// Create a timer with a ten second interval.
aTimer = new System.Timers.Timer(10000);

// Hook up the Elapsed event for the timer.
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

// Set the Interval to 10min.
aTimer.Interval = 600000;
aTimer.Enabled = true;

Console.WriteLine("Press the Enter key to exit the program.");
Console.ReadLine();
}

private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
aTimer.Enabled = false;

// excutes some code

aTimer.Enabled = true;
}
}

最佳答案

由于您的类中有一个字段指向您的计时器对象,因此 GC 将不会收集计时器对象。

但是您的代码可能会引发异常,这会阻止 Enabled 属性再次变为 true。为了防止这种情况发生,您应该使用 finally block :

private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
aTimer.Enabled = false;
try
{
// excutes some code
}
catch(Exception ex)
{
// log the exception and possibly rethrow it
// Attention: never swallow exceptions!
}
finally
{
aTimer.Enabled = true;
}
}

关于c# - 启用 System.Timers.Timer 和 GarbageCollector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14920070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com