none
Windows FormアプリケーションでSystem.Thread.Timerを使用する方法 RRS feed

  • 質問

  • こんにちは。

    ものすごく基本的なことだと思うのですが、検索してもコンソールアプリケーションの例しか見つけることが出来ず、また質問させていただきます。

    private void btnStart_Click(object sender, EventArgs e){
    TimerCallback tc = new TimerCallback(Process);
    Timer timer = new Timer(tc, "Data", 1000, 1000);
    Console.ReadLine();
    }

    というようなコードを書いた場合、ConsoleアプリケーションではConsole.ReadLineによってスレッドが維持され、Timerが動き続けますが、ボタンクリック等をきっかけにしてTimerを動かす場合はこのやり方では一瞬で終了してしまいます。

    こういうときは、どうやってメインスレッドを維持するものなのでしょうか。

    2006年9月22日 8:25

回答

  • > こういうときは、どうやってメインスレッドを維持するものなのでしょうか。
     
    コンソールアプリケーションは勝手に終了しますけど、WinForms は通常はフォームを閉じるまで終了しないようになっています。
    WinForms では、メインフォームが閉じるか、明示的に終了するためのメソッドが呼ばれないかぎり、UIスレッドは終了しないです。
    ですので、何もせず Button.Click イベントを抜けたとしても、UI スレッドが勝手に終了したりはしません。
     
    また、WinForms でバックグラウンド処理をしたいなら、BackgroundWorker なんかが手軽でよいかもしれません。
     
    2006年9月22日 10:39

すべての返信

  • > こういうときは、どうやってメインスレッドを維持するものなのでしょうか。
     
    コンソールアプリケーションは勝手に終了しますけど、WinForms は通常はフォームを閉じるまで終了しないようになっています。
    WinForms では、メインフォームが閉じるか、明示的に終了するためのメソッドが呼ばれないかぎり、UIスレッドは終了しないです。
    ですので、何もせず Button.Click イベントを抜けたとしても、UI スレッドが勝手に終了したりはしません。
     
    また、WinForms でバックグラウンド処理をしたいなら、BackgroundWorker なんかが手軽でよいかもしれません。
     
    2006年9月22日 10:39
  • Lady.BUGさん、返信ありがとうございます。

    Button.ClickイベントでTimerを起動するのですが、良くて一回起動して止まってしまいます。
    Form自体がメインスレッドだからTimerは動いているはずなのですね。
    もうちょっと他の原因を調べて見ます。

    ありがとうございました。
    2006年9月22日 10:57