System.Timers.Timer
別のスレッドで実行される を使用する必要があります 。このMSDN の記事を参照してください。
上記のリンクから:
System.Windows.Forms.Timer
メトロノームを探しているなら、間違った場所に来ています。このタイマー クラスによって発生するタイマー イベントは、Windows フォーム アプリの残りのコードに対して同期的です。これは、実行中のアプリケーション コードが、このタイマー クラスのインスタンスによってプリエンプトされることがないことを意味します (Application.DoEvents を呼び出さない場合)。
System.Timers.Timer
.NET Framework のドキュメントでは、System.Timers.Timer クラスを、マルチスレッド環境で使用するために設計および最適化されたサーバー ベースのタイマーと呼んでいます。このタイマー クラスのインスタンスは、複数のスレッドから安全にアクセスできます。System.Windows.Forms.Timer とは異なり、System.Timers.Timer クラスは既定で、共通言語ランタイム (CLR) スレッド プールから取得したワーカー スレッドでタイマー イベント ハンドラーを呼び出します。これは、Elapsed イベント ハンドラー内のコードが Win32 プログラミングのゴールデン ルールに準拠している必要があることを意味します。コントロールのインスタンスは、インスタンス化に使用されたスレッド以外のスレッドからアクセスしてはなりません。
作業コード:
public partial class Form1 : Form
{
System.Timers.Timer tmr = new System.Timers.Timer(1000);
volatile int timer;
public Form1()
{
InitializeComponent();
}
private void Form1_Shown(object sender, EventArgs e)
{
timer = 0;
tmr.Elapsed += new System.Timers.ElapsedEventHandler(tmr_Elapsed);
tmr.Start();
while (timer < 2) ;
tmr.Stop();
Console.WriteLine("timer ends");
}
void tmr_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
Console.WriteLine(timer);
timer++;
}
}