c# - 为什么这个方法会导致Code Analysis error CA2000 : Call Dispose()

标签 c# .net timer code-analysis

我正在使用“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;
}

此方法只是根据以秒为单位的时间间隔创建一个新的 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 实现中处理所有计时器。

我在这里错过了什么?

最佳答案

您只在发生异常时调用 Dispose(顺便说一句,您永远不应该使用包罗万象的 block 来处理,但那是另一回事了)。在没有异常的情况下,您不会释放 Timer 对象。

要么添加一个 finally block 并将 Dispose 移到那里,要么使用一个 using block 。

关于c# - 为什么这个方法会导致Code Analysis error CA2000 : Call Dispose(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10697532/

相关文章:

c# - 创建简单的 c++.net 包装器。一步步

C# 字符串重复问题

.net - 将 HTML 导出到 Excel 的单元格背景颜色

c# - RijndaelManaged key 长度与 AES[ key 长度] 相同吗?

ios - NSTimer 选择器即使在后台也会不断被调用

batch-file - 如何创建批处理文件计时器以全天执行/调用另一个批处理

java - 跟踪 Java 中窗口打开的时间

c# - 无法在 VS 2022 Enterprise 版本 17.0.0 中编译 Azure Function v4 进程外

c# - 开始使用 Orleans : Implementation, 托管和部署

c# - 如何打开图像并使用 C# .Net Compact Framework 编辑图像。