我正在使用“Microsoft Minimal Rules”代码分析集构建我的项目,并且该方法给我返回了CA2000警告:
该方法只是从以秒为单位的间隔创建一个新的
现在我在catch中调用了Dispose,我认为这已经足够了?我还在类自己的IDisposable实现中释放了所有的定时器。
我在这里漏掉了什么?
private Timer InitializeTimer(double intervalInSeconds)
{
Timer timer = null;
try
{
timer = new Timer { Interval = intervalInSeconds * 1000, Enabled = true };
timer.Elapsed += timer_Elapsed;
timer.Start();
}
catch
{
if (timer != null)
{
timer.Dispose();
}
}
return timer;
}
该方法只是从以秒为单位的间隔创建一个新的
System.Timers.Timer
。我有三个这样的定时器在运行(每秒钟一个,每分钟一个和每半小时一个)。也许最好只有一个定时器,并在经过事件处理程序中检查是否已经过了一分钟或半小时,但我不知道,目前这种方法更容易,因为它是继承的代码,我还不想破坏一切。
该方法给我带来了臭名昭著的
Warning 21 CA2000 : Microsoft.Reliability : In method 'TimerManager.InitializeTimer(double)', call System.IDisposable.Dispose on object '<>g__initLocal0' before all references to it are out of scope.
现在我在catch中调用了Dispose,我认为这已经足够了?我还在类自己的IDisposable实现中释放了所有的定时器。
我在这里漏掉了什么?
timer
)。我正在尝试查找处理此问题的重复问题。 - Damien_The_UnbelieverInterval
可能会抛出ArgumentException
,因此分析正确,如果没有调用Dispose
,则该可处理对象将被泄漏。 没有任何文档记录(我找不到)表明如果未调用Start
,则无需Dispose
计时器(尽管当前实现可能是这样)。 - Damien_The_Unbeliever