正确使用与计时器一起使用(或任何与使用相关的对象)

本文关键字:对象 任何 计时器 一起 | 更新日期: 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

在您的示例中,您的原始对象不仅在其他方法中是未知的,而且还会被删除。

相关文章: