2012-01-19 8 views
1

で独自の背景ティックスレッドを作成するとの違いは何ですか:System.Threading.Timerと、私は次のように構成されている背景ティック機能を持つC#の

System.Threading.Thread myTimerThread = new Thread(this.Tick); 

    private void Tick(){ 
     do{ 
      //do stuff 
      System.Threading.Sleep(1000L); 
     }while(true)  
    } 

しかし、System.Threadingもあります。私のためにこれを行うティマークラス。 Tick関数を使用して独自のバックグラウンドスレッドを作成するのではなく、System.Threadingに組み込まれたTimerクラスを使用することの違いは何ですか?

答えて

4

Timerクラスは、非常に軽量でdo-while文の無限の内側に指定された時間のために眠っているあなた自身の専用スレッドに比べて、より効率的です。

DoがのThread.sleepが実際にどのように動作するか、それが他方のSystem.Threading.Timerで完全なスレッドとリソース

タイマーを実行するためのThreadPoolスレッドを使用します無駄に方法を見つけるためのThread.Sleep is a sign of a poorly designed programをお読みください。 Timerクラスを使用する他の利点私のMSDN

を説明するようにタイマーを作成するときは、法(期限)の 最初の実行、および時間の量までの待機時間を指定することができますその後の実行(期間) の間を待ちます。これらの値を変更するか、Changeメソッドを使用してタイマーを無効にすることができます。

あなたは長時間実行される操作を実行している場合を除き、スレッドプールを使用し、すべての

+0

引用にコードブロックから引用したテキストを変更する自由を取りました。 –

+0

あなたはあなたがThread.Sleepに投稿した記事を読んで、私は間違いなく任意のチックスレッドを作成し、ループと睡眠を使用することは非常に高価で望ましくないことが分かります。 –

0

最初のスレッドに基づくアプローチをこれらの利点を持っていません。独自のタイマーのロールとSystem.Threading.Timerの違いは、System.Threading.Timerがハードウェア割り込みを使用してチックを実行するのが適切かどうかを知ることです。 xミリ秒間だけスリープするよりも正確です(マルチメディアタイマーはさらに正確です)。スレッドが制御権を持つ前に制御がスレッドスケジューラーに渡されるまで待たなければなりません。

スレッド上のGuiに影響を及ぼす何かを行う場合は、適切なGuiバージョンのタイマーを使用する必要があります。それ以外の場合は、Guiコントロールにアクセスする必要があります。正しいスレッドを取得するためにInvokeする必要があります。 Windowsフォームの場合はSystem.Windows.Forms.Timers、WPFとSilverlightの場合はSystem.Windows.Threading.DispatcherTimerです。スレッドとタイマーの詳細については、Joseph Albahariの無料電子ブックThreading in C#をお勧めします。

+0

しかし、アプリケーションの場合、私はSystem.Windows.Forms.Timerを認識しています。DoEvents()が呼び出されると、ティックは再びキューに入れられ、私のシナリオでは信頼できるティック関数には望ましくありません。 –

+1

"間違っている"場合は、Application.DoEvents()を呼び出す必要はありませんし、何をやっているのかを再構築する必要があります。 DoEventsはVB6にのみ存在していました。なぜなら、あなたはマルチスレッドを行う能力を持たず、いくつかのことが長くかかったからです。それは常に問題につながり、競合状態をデバッグするのは難しく、可能な限り回避します。 Jeffの話を聞く:http://www.codinghorror.com/blog/2004/12/is-doevents-evil.html –

0

あなたはSystem.Threading.Timerを使用して、より制御をたくさんしています。あるスレッドまたはイベントを毎回確認するようにタイマーをプログラムすることができます。実行するまで1/4秒ごとに処理を行い、disposeメソッドを使用してタイマーを破棄することができます。あなたが望むものを何でもするようにプログラムすることができますし、もっと正確です。あなたはのThread.sleepを使用する場合

、あなたは本当にオプションを1つだけ持っているし、それは秒のxについて、「スリープ」にプログラムを強制することです。私の知る限りでは、それを処分することはできません。結論は、あなたのプログラムが実行された後でさえ、Thread.Sleepはプログラムを強制的にスリープさせ続けるということです。 Threading.Timerは、プログラムの実行が終了すると停止するようにプログラムすることができます。

関連する問題