为什么此方法会导致代码分析错误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()

下一篇: Caching & avoiding Cache Stampedes