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 中描述的终结器 ~ClassName
、Dispose
和 Dispose(bool)
。但这主要是在您同时使用托管和非托管资源的情况下。
我之前一直在开发一个 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 中描述的终结器 ~ClassName
、Dispose
和 Dispose(bool)
。但这主要是在您同时使用托管和非托管资源的情况下。