web-dev-qa-db-ja.com

C#の別のスレッドからタイマーを開始します

こんにちは私はタイマーに関連するいくつかの問題に足を踏み入れました。誰かが助けてくれることを願っています。

  1. ボタンを含むウィンドウフォームがあります
  2. そのボタンをクリックすると、パラメーター化されたスレッドが開始されます
_Thread thread1 = new Thread(new ParameterizedThreadStart( execute2));
thread1.Start(externalFileParams);
_
  1. スレッド内のコードは非常にうまく実行されます
  2. このスレッドの最後の行で私はタイマーを開始します

_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)ですが、起動されませんでした

誰かが私が間違っていることを提案できますか?

14
Swati


次の方法でタイマーを開始することができます:

フォームコンストラクタにこれを追加します。

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;

このタイマーはすでにスレッド化されているため、新しいスレッドを開始する必要はありません。

18
Gabriel

マティアスフィデムライザの言うとおりです。しかし、回避策があります...

呼び出し可能なフォーム上のコントロール(たとえば、ステータスバー)がある場合は、そのコントロールを呼び出すだけです!

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!");
}
7
321X

System.Windows.Forms.Timerは、シングルスレッドアプリケーションで機能します。

このリンクを確認してください:

備考は言う:

タイマーは、ユーザー定義の間隔でイベントを発生させるために使用されます。このWindowsタイマーは、UIスレッドを使用して処理を実行するシングルスレッド環境向けに設計されています。ユーザーコードには、利用可能なUIメッセージポンプがあり、常に同じスレッドから操作するか、呼び出しを別のスレッドにマーシャリングする必要があります。

詳細の「備考」セクションを読むと、MicrosoftはこのタイマーをUIスレッドと同期して使用することをお勧めしていることがわかります。

3

BackgroundWorkerrawスレッドの代わりに)を使用します。メインスレッドはワーカーの RunWorkerCompleted event にサブスクライブします:スレッドが完了すると、イベントがメインスレッドで発生します。このイベントハンドラーを使用して、タイマーを再起動します。

0
Serge Wautier