2012-04-17 7 views
0

現在のコードが現在構成されている(または使用して、任意のオブジェクトが関連しています) 。だから私は(hereから取られた)私のコードに次のようなものを適用しようとしました:正しい使用

using (SomeClass someClass = new SomeClass()) 
{ 
someClass.DoSomething(); 
} 

私はmyTimerSecondMethod()で知られていないので、次はエラーになりますと仮定しますか?

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

なぜSecondMethodはmyTimerについて知る必要がありますか?廃棄するとタイマーが停止します。 – payo

+0

IIRCでは、 'using'はガベージコレクションを行いません。オブジェクト内で' Dispose'を呼び出すだけです。タイマーが実際に使用するリソースがない限り、「使用する」には実質的な利点はありません。 –

+0

@KenWayneVanderLindeが正しい場合、GC処理は行われません(そのクラスに固有のマーシャリングされたデータを除く)。 – payo

答えて

1

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ブロックは問題になりません。

+0

System.Threading.TimerはIDisposableを実装しています - 達成しようとしているのは何でも@whytheqはそれを利用できますか? http://msdn.microsoft.com/en-us/library/saba8ksx%28v=vs.90%29.aspx –

+0

@EdS。 [ここ](http://stackoverflow.com/questions/475763/is-it-necessary-to-dispose-system-timers-timer-if-you-use-one-in-your-applicatio)は、 IDisposable – whytheq

+0

'Timer'は' IDisposable'を実装する 'Component'から継承しています。 –

0

usingのみIDisposableを実装し、それが使用して、ブロックの終了時に削除されるオブジェクトに使用することができます。他の場所でそのオブジェクトを使用する必要がある場合は、usingを使用することはできません。

あなたの例では、オリジナルのオブジェクトは他の方法では認識されないだけでなく、削除されます。

+0

完全なコードで 'secondMethod'は実際にはTimerのイベントの1つに登録されているメソッドです - ' secondMethod'に条件文があり、特定の条件の下で 'Timer'を止めることができます – whytheq

+0

なぜタイマコンポーネントをあなたのフォーム? (これはWebFormアプリですか?)単にコントロールをオン/オフするだけで、コントロールを動的に作成する理由がわかりません。注意:私はいつも 'using'を使い、それを好きですが、上記の制限は私がどこでも使うことができないことを意味します。 –

+0

これはWindowsフォームです。私が読んだことから、System.Timers.TimerはTimerなどのフォームのすべてを実行します。そのため、私はそれを使用しています。助けてくれてありがとう - 私は様々なオブジェクトに精通して遊んでいるだけです。 – whytheq

1

usingブロックの終了後にオブジェクトを破棄(=破棄)する必要がある場合は、usingしか使用できません。通常タイマーはそれよりも長く続きます(例のように)。

0

はい、あなたは正しいです。 myTimerがローカル変数として宣言されているため、スコープを使用しているため、コードが間違っています。コードを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(); 
} 
+0

ダンはマイケルの下でこれを示唆し、叫んだ! – whytheq

+0

これは、どんな合理的な方法でもタイマーを使用していないので、ちょっとしたコードです。 –

+0

@EdS。私の最後の投稿は別の[スレッド](http://stackoverflow.com/questions/10170448/introducing-timer-means-its-multi-threaded)に完全なコードがあります。あなたは私が使ってみた 'keptTime()'メソッドで見ることができます...しかし、このスレッドは別のアプローチを見つける必要があることを確認しました – whytheq

0

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

ただし、「力」コレクションに試みることができる -

を「収集を呼び出すことによって、ガベージコレクションを強制することは可能であるが、それはパフォーマンスの問題を作成する可能性があるため、ほとんどの時間は、これは避けるべきです。 "

したがって、SecondMethodをmyTimerに「アクセスする」必要がありますか?

+0

ちょうどKris - SecondMethodは実際にTimerイベントが購読されているメソッドですに。しかし、一定の条件が満たされている場合、SecondMethodはタイマーを停止する必要があります。すべてのビットが動作しますが、今私はゴミがOKを収集し、代替を探していることを確認しようとしています – whytheq