C# 定时器和内存

C# Timers and Memory

我之前一直在开发一个 c# 应用程序,我不得不使用定时器。现在我要将此应用程序从控制台 1 更改为 windows 服务。我尝试稍微优化我的代码并确保它作为服务正常工作。所以定时器...

这几乎就是我现在声明计时器的方式:

firstTimer = new System.Timers.Timer(5000); 
firstTimer.Elapsed += FirstEvent;
firstTimer.Enabled = false;

我可以在这里 https://msdn.microsoft.com/en-us/library/zb0225y6%28v=vs.110%29.aspx 看到 Timer class 实现了 IDisposable,所以我可以调用 Dispose() 并期望一切正常?我的 class 有 3 个定时器。我应该只在每个计时器上调用 Dispose() 还是对我的 class 实现 IDisposable 并像这样定义 Dispode 方法:

public void Dispose()
        {
            firstTimer.Elapsed -= FirstEvent;
            secondTimer.Elapsed -= SecondEvent;
            thirdTimer.Elapsed -= ThirdEvent;

            firstTimer.Dispose();
            secondTimer.Dispose();
            thirdTimer.Dispose();

            this.Dispose();
        }

或者这是不好的做法?我什至需要这样做 firstTimer.Elapsed -= FirstEvent; 吗?或者计时器会在 -= 之后自动处理吗?

因为我在我的 class 上实现了 IDisposable,所以我想在它上面使用 using 块是正确的。

static void Main(string[] args)
{
    using (Myclass mc = new Myclass())
    {
        mc.init();
    }
}

init 方法是我的计时器声明和所有相关内容的地方。

总结一下我的问题。这种方法正确吗?我可以添加一些东西吗?也许我所做的是愚蠢的?还有很多关于处理计时器的其他话题,但我真的无法从中得到答案。

感谢您的见解。

您的 Dispose 方法应该如下所示:

public void Dispose()
{
    firstTimer.Dispose();
    secondTimer.Dispose();
    thirdTimer.Dispose();
}

递归调用 this.Dispose() 当然是一个非常糟糕的主意。不需要删除事件处理程序。


或者您可以实施更复杂(通常不是必需的)方法来实施 this article 中描述的终结器 ~ClassNameDisposeDispose(bool)。但这主要是在您同时使用托管和非托管资源的情况下。