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

usingTimerオブジェクトを正しくガベージコレクションするために使用できるとアドバイスされました。だから私は私のコードに次のようなものを適用しようとしました(ここから取得):

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スコープでのみ使用できるため、コードが間違っています。コードを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();  
}
于 2012-04-17T21:43:01.110 に答える
1

「usingパターン」は、実装オブジェクトがスコープ内になくなったときにDisposeを自動的に呼び出すために使用されます。Disposeは、管理されていないリソースをクリーンアップするために使用されます。Finalizeは、オブジェクトが「収集」される前にガベージコレクターが呼び出すものです。

ただし、コレクションを「強制」することはできますが、

「コレクトコールを呼び出すことでガベージコレクションを強制することは可能ですが、パフォーマンスの問題が発生する可能性があるため、ほとんどの場合、これは回避する必要があります。」

では、myTimerに「アクセス」するにはSecondMethodが必要ですか?

于 2012-04-17T21:44:12.553 に答える