0

目前的代码结构如下:

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();  
}  

我假设以下将出错,因为myTimer不知道SecondMethod()

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();  
}
4

5 回答 5

2

在有意义的情况下,您可以将实现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街区是不可能的。

于 2012-04-17T21:41:39.287 回答
2

只有在块结束using后应该处置(=销毁)对象时才能使用。using计时器的持续时间通常比这更长(如您的示例中所示)。

于 2012-04-17T21:42:07.360 回答
1

using只能在实现的对象上使用IDisposable,它会在 using 块的末尾自动释放。如果您需要在其他任何地方使用该对象,则不能使用using.

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

于 2012-04-17T21:40:56.587 回答
1

是的你是对的。您的代码是错误的,因为 myTimer 被声明为局部变量,并且它仅在using范围内可用。您应该将代码更改为某事。像这样

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();  
}
于 2012-04-17T21:43:01.110 回答
1

“使用模式”用于在实现对象不再在范围内时自动调用 Dispose。Dispose 用于清理所有非托管资源。Finalize 是垃圾收集器在“收集”对象之前调用的内容。

您可以尝试“强制”收集,但是 -

“可以通过调用 Collect 来强制进行垃圾收集,但大多数情况下,应该避免这样做,因为它可能会产生性能问题。”

所以你需要 SecondMethod 来“访问” myTimer?

于 2012-04-17T21:44:12.553 回答