C#でスレッドを使うときの注意です。
System.Windows.Forms.Timer
はお手軽でよく使いますが、このTimerはUIスレッドでのみ動くためなのか、別スレッドから呼ぶと動かないみたいです。
System.Threading.Thread
や System.Threading.Timer
、TcpListener::BeginReceive()
などで作ったスレッド内で System.Windows.Forms.Timer
を作ってStart()
メソッドを呼んでも、Tickはいくら待っても呼ばれません。
//テストコード
Thread thread = new Thread(new ThreadStart(delegate {
System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer { Interval = 1000 };
timer.Tick += new EventHandler(delegate { MessageBox.Show("HOGE");});
timer.Start();
}));
thread.Start();
解決
上記のテストコードで、メッセージボックスは永久に出ません。
System.Windows.Forms.Timer
を System.Threading.Timer
に変えれば動くので、これは System.Windows.Forms.Timer
の制約のようです。
ネットワークでパケット受信をトリガに処理を始めるときなど、うっかりミスしないように気をつけましょう。