gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:34:40 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com