正确使用与计时器一起使用(或任何与使用相关的对象)
本文关键字:对象 任何 计时器 一起 | 更新日期: 2023-09-27 18:31:23
当前代码的结构如下:
System.Timers.Timer myTimer;
public void FirstMethod() {
myTimer;= new System.Timers.Timer();
myTimer.start();
SecondMethod();
}
public void SecondMethod(){
//several things happen here and then
myTimer.stop();
}
有人建议我可以使用using
来正确垃圾回收 Timer 对象。所以我尝试将以下内容应用于我的代码(从这里获取):
using (SomeClass someClass = new SomeClass())
{
someClass.DoSomething();
}
我假设以下内容会出错,因为SecondMethod()
不知道myTimer
?
public void FirstMethod() {
using (System.Timers.Timer myTimer = new System.Timers.Timer())
{
myTimer.start();
SecondMethod();
}
}
public void SecondMethod(){
//several things happen here and then
myTimer.stop();
}
只有在using
块结束后应释放(=销毁)对象时,才能使用using
。计时器的持续时间通常比这更长(如您的示例所示)。
时,将实现IDisposable
接口的对象包装在using
块中。 在这种情况下,它不是,因为对象必须在更高的范围内有效。 请记住,using
语句只是对此的简写(语法糖):
var myDisposableObj = new Whatever();
try
{
// use myDisposableObj. If an exception is thrown
// in here somewhere the call to Dispose() still occurs.
}
finally
{
myDisposableObj.Dispose();
}
在您的情况下,您需要确保在完成对象时对对象调用Dispose()
(并且以考虑可能引发的异常的方式,这些异常会阻止对Dispose()
的调用发生)。 你需要Timer
停留一段时间,所以using
块是不可能的。
"using 模式"用于在实现对象不再在作用域中时自动调用 Dispose。 释放用于清理任何非托管资源。 Finalize 是垃圾回收器在"收集"对象之前调用的内容。
但是,您可以尝试"强制"收集 -
"可以通过调用 Collection 来强制垃圾回收,但大多数情况下,应该避免这样做,因为它可能会产生性能问题。
所以你需要第二方法才能"访问"myTimer?
是的,你是对的。您的代码是错误的,因为 myTimer 被声明为局部变量,并且仅在 using 范围内可用。您应该将代码更改为 sth。喜欢这个
public void FirstMethod() {
using (System.Timers.Timer myTimer = new System.Timers.Timer())
{
myTimer.start();
SecondMethod(myTimer);
}
}
public void SecondMethod(System.Timers.Timer theTimer){
//several things happen here and then
theTimer.stop();
}
using
只能在实现IDisposable
的对象上使用,并且会在 using 块结束时自动释放。如果需要在其他任何地方使用该对象,则不能使用 using
。
在您的示例中,您的原始对象不仅在其他方法中是未知的,而且还会被删除。