こんにちは私はタイマーに関連するいくつかの問題に足を踏み入れました。誰かが助けてくれることを願っています。
_Thread thread1 = new Thread(new ParameterizedThreadStart( execute2));
thread1.Start(externalFileParams);
_
。
_public void execute2(Object ob)
{
if (ob is ExternalFileParams)
{
if (boolean_variable== true)
executeMyMethod();//this also executes very well if condition is true
else
{
timer1.enabled = true;
timer1.start();
}
}
}
}
_
5しかし、タイマーのティックイベントは発生しません
私はVS20083.5フレームワークに取り組んでいます。タイマーをツールボックスからドラッグしてInterval
を300に設定しましたEnabled
も設定しようとしましたtrue/falseメソッドはtimer1_Tick(Object sender , EventArgs e)
ですが、起動されませんでした
誰かが私が間違っていることを提案できますか?
次の方法でタイマーを開始することができます:
フォームコンストラクタにこれを追加します。
System.Timers.Timer aTimer = new System.Timers.Timer();
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
// Set the Interval to 1 second.
aTimer.Interval = 1000;
このメソッドをForm1に追加します。
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
//do something with the timer
}
ボタンクリックイベントでこれを追加します:
aTimer.Enabled = true;
このタイマーはすでにスレッド化されているため、新しいスレッドを開始する必要はありません。
マティアスフィデムライザの言うとおりです。しかし、回避策があります...
呼び出し可能なフォーム上のコントロール(たとえば、ステータスバー)がある場合は、そのコントロールを呼び出すだけです!
C#コードサンプル:
private void Form1_Load(object sender, EventArgs e)
{
Thread sampleThread = new Thread(delegate()
{
// Invoke your control like this
this.statusStrip1.Invoke(new MethodInvoker(delegate()
{
timer1.Start();
}));
});
sampleThread.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
MessageBox.Show("I just ticked!");
}
System.Windows.Forms.Timerは、シングルスレッドアプリケーションで機能します。
このリンクを確認してください:
備考は言う:
タイマーは、ユーザー定義の間隔でイベントを発生させるために使用されます。このWindowsタイマーは、UIスレッドを使用して処理を実行するシングルスレッド環境向けに設計されています。ユーザーコードには、利用可能なUIメッセージポンプがあり、常に同じスレッドから操作するか、呼び出しを別のスレッドにマーシャリングする必要があります。
詳細の「備考」セクションを読むと、MicrosoftはこのタイマーをUIスレッドと同期して使用することをお勧めしていることがわかります。
BackgroundWorker (rawスレッドの代わりに)を使用します。メインスレッドはワーカーの RunWorkerCompleted event にサブスクライブします:スレッドが完了すると、イベントがメインスレッドで発生します。このイベントハンドラーを使用して、タイマーを再起動します。