为什么此方法导致代码分析错误CA2000:调用Dispose()

Dav*_*vio 7 .net c# code-analysis timer

我正在使用"Microsoft Minimal Rules"代码分析集构建我的项目,它给了我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;
}
Run Code Online (Sandbox Code Playgroud)

此方法只是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.
Run Code Online (Sandbox Code Playgroud)

现在我在捕获中调用Dispose并认为这就足够了?我也将所有计时器都放在了类自己的IDisposable实现中.

我在这里错过了什么?

Chr*_*n.K 2

您仅Dispose在发生异常时调用(顺便说一句,您永远不应该使用包罗万象的块来处理异常,但那是另一个故事)。如果没有例外,您不会处置该Timer对象。

添加一个finally块并将其移动Dispose到那里,或者使用一个using块。