在我的项目中,我创建了System.Timers.Timer
个对象,间隔设置为10分钟。
我每10分钟就会有一个过去的事件。在这个事件处理程序中,我正在执行一些代码。
在执行此代码之前,我将Enabled
属性设置为等于false
,因为如果处理程序执行的时间比下一个时间间隔长,则另一个线程会执行已用事件。
这里的问题突然发生Elapsed
事件。
我已经阅读了一些文章并怀疑当前启用的属性设置为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;
}
}
答案 0 :(得分:3)
由于您的类中有一个字段指向您的计时器对象,因此GC不会收集计时器对象。
但是您的代码可能会引发异常,这可能会阻止Enabled
属性再次变为true。为了防范这种情况,您应该使用finally
块:
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;
}
}
答案 1 :(得分:0)
您可以设置同步对象,在这种情况下,经过的时间只会发生在 该对象的所有者线程,没有并发性。 类似的问题发布在这里: Do C# Timers elapse on a separate thread?