System.Windows.Forms.TimerとSystem.Timers.Timerの違い

2987 ワード

.NET Frameworkでは3種類のTimerが提供されています.
  • System.Windows.Forms.Timer
  • System.Timers.Timer
  • System.Threading.Timer

  • VS.Net 2005はデフォルトでは1つのTimerコントロールしかありませんが、それはSystem.Forms.Timerコントロールです.System.Timers.Timerのコントロールを使用する場合は、ツールボックスを右クリックして手動で追加する必要があります.
    追加する手順:ツールボックスを右クリック->Add Item->名前空間がSystem.Timers.Timerのコントロールであることを確認し、それを選択してOKにします.
    ここではこの2つのTimerの違いを簡単に紹介します.
    System.Windows.Forms.Timerは比較的多く使用されているTimerであり、Timer Start以降のタイミング(設定されたInterval)でTickイベントに接続されているEventHandlerを呼び出す.このようなTimerのEventHandlerでは、実際にはUIスレッド自体で呼び出されるため、UI要素を直接取得および変更することができる.そのため,TimerのEventHandlerにおいて長時間のブロック呼び出しが行われ,インタフェース応答がブロックされる結果となった.簡単な例を次に示します.
    public class MainForm : Form{
    private void MainForm_Load(object sender, EventArgs e){timer.Interval = 1000;timer.Tick += delegate(object o, EventArgs args){DoWork();};timer.Start();}
    private void DoWork(){for (int i = 0; i < 10; i++){System.Threading.Thread.Sleep(1000);}}System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();}
    この例では、DoWorkメソッドでは10秒ブロックされ、この10秒以内にUIは応答を失います.System.Timers.Timerを使用することで、この問題を解決できます.System.Timers.Timerは.NETのThread Pool上で実行されるため、UI Thread上で直接実行されるのではなく、.NETのThread Pool上で実行されるため、このようなTimerのEventHandler内で時間のかかる計算を行うとUIが応答を失うことはありません.しかし、ここには2つの点に注意する必要があります.
  • 一般的にSystem.Timers.TimerはUI Thread上で実行されていないため、このようなTimerのEventHandlerでUI要素を更新するには、スレッド切り替えが必要であり、WinForm開発ではUI要素のInvokeメソッドで一般的に完了する.
    private void DoWork() { for (int i = 0; i < 10; i++) { System.Threading.Thread.Sleep(1000); } this.Invoke(new UpdateUICallBack(UpdateUI)); }
    private delegate void UpdateUICallBack();
    private void UpdateUI(){}
  • System.Timers.Timerには、Property:SynchronizingObjectがあります.このプロパティ(一般的にはForm)が設定されている場合、このUI要素を作成するスレッド(一般的にはUIスレッド)上で、その後にTimerが接続されるEventHandlerの呼び出しが行われます.WinFormデザイナでSystem.Timers.TimerをFormにドラッグすると、このPropertyが自動的に設定されます.このとき、このようなTimerはSystem.Windows.Forms.Timerの効果と同じです.長い呼び出しはインタフェースをブロックします.

  • System.Windows.Forms.Timer 1.Formベースのタイマー2.作成後、Intervalを使用してTick間のスパンを設定し、依頼(delegate)hook Tickイベント3.StartとStopメソッドを呼び出し、開始と停止4.UIスレッドに完全に基づいて、したがって、UI関連の一部の操作は、このタイマ内で5.長時間のUI操作を行うと、一部のTickが失われる可能性がある
    System.Timers.Timer 1.は、TickイベントではなくElapsedイベント2.System.Windows.Forms.Timerと同様に、StartとStopメソッド3.AutoResetプロパティで、タイマがイベントを開始して停止するか、開始/待機のループに入るかを決定します.System.Windows.Forms.Timerにはこの属性がありません4.UIコントロールの同期オブジェクト(synchronizing object)を設定し、コントロールのUIスレッドにイベントを開始します
    この両者はSystem.Threading.Timerとの違いを比較するとhttp://mark.michaelis.net/Blog/SystemWindowsFormsTimerVsSystemThreadingTimerVsSystemTimersTimer.aspxここでは、System.Windows.Forms.Timerがユーザーインタフェースプログラミングの比較的明らかな選択であることを最後にまとめたもののみを抜粋します.他の2つの間の選択は明らかではありません.IContainer内でなければならない場合は、System.Timers.Timerを選択する必要があります.System.Timers.Timerのプロパティが使用されていない場合は、System.Threading.Timerを選択することをお勧めします.これは、やや軽量レベルです.
    Timerは、まず実行を待ってから実行します.もし私たちが先に実行してから待つ効果を達成するには、デフォルトの間隔Interval=100を設定するか、1以下(0にできない)に設定してから、イベント内で間隔Intervalを所望の値に変更します.