

.Net FrameWork 4.5 にて下記プログラム作成しました。  
Taskで実行するとtimerはtimer_Tickにたどり着かず、  
そのまま呼び出すとtimer_Tickに行きます。  
両者の違いは何故発生するのでしょうか？  
よろしくお願いします。

[code]

    class a
    {
         Timer timer = new Timer();
         public a()
         {
              timer.Tick +=  timer_Tick;
         }
         public void Start()
         {
              timer.Interval = 1000;
              timer.Start();
         }
         void timer_Tick(object sender, EventArgs e)
         {
            return;
         }
    }
    
    class main
    {
         public main()
         {
            a A = new a();
            Task.Run(() => { A.Start(); });  //Tick しない。
            A.Start();  //Tick する。
         }
    }
    
[/code]


CC BY-SA 3.0
2017-02-08T14:25:06.073
32509
2017-05-30T19:10:36.967
20572
question
c#
Task内で使用するタイマーがTickしない。


System.Windows.Forms.Timerを使用していたことが原因でした。  
System.Timers.Timerを使用することでTaskて使用してもTick (Elapsed)することがわかりました。


CC BY-SA 3.0
2017-02-08T15:11:35.673
32511
2017-02-08T15:11:35.673
20572
32509
answer


自己解決済みですが、原因説明を。

  * `System.Windows.Forms.Timer`はUIスレッド上で実行を開始し、UIスレッド上で呼び出されます。実行したスレッドがUIスレッド出なかった場合は呼び出しようがないため動作しません。
  * `System.Timers.Timer`はスレッドプールから呼び出されます。どのスレッドからでも実行可能です。

というわけで質問文のコードに関して言えば、`Task.Run()`から実行する意味はあまりなく、メインスレッドから実行すればいいでしょう。


CC BY-SA 3.0
2017-02-08T23:05:07.563
32514
2017-02-08T23:05:07.563
4236
32509
answer