为什么此方法会导致代码分析错误CA2000:Call Dispose()
我正在用“微软最小规则”代码分析集来构建我的项目,它给了我这种方法的CA2000:
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.
现在我在调用Dispose,并认为这足够了? 我还将所有计时器都放在类自己的IDisposable实现中。
我在这里错过了什么?
如果发生异常,你只能调用Dispose
(你不应该用一个catch-all块来处理,但这是另一回事)。 在没有例外的情况下,您不会处理Timer
对象。
或者添加一个finally
块并在其中移动Dispose
,或使用using
块。
该警告告诉您,您正在创建一个可丢弃的对象,而不是在所有情况下处理它。 如果您正在以其他方法正确处理它,则可以安全地禁止此警告(您可以使用SuppressMessageAttribute来执行此操作)。
好吧,我这样编辑它:
private Timer InitializeTimer(double intervalInSeconds)
{
Timer tempTimer = null;
Timer timer;
try
{
tempTimer = new Timer();
tempTimer.Interval = intervalInSeconds * 1000;
tempTimer.Enabled = true;
tempTimer.Elapsed += timer_Elapsed;
tempTimer.Start();
timer = tempTimer;
tempTimer = null;
}
finally
{
if (tempTimer != null)
{
tempTimer.Dispose();
}
}
return timer;
}
这是根据CA2000文档,并没有给出警告。 我忽略了这样一个事实,即对象初始化程序语法会创建一个不可处理的临时对象。
多谢你们!
链接地址: http://www.djcxy.com/p/10803.html上一篇: Why does this method cause Code Analysis error CA2000: Call Dispose()