• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C#で処理中の状況をStatusLabelに表示)

C#で処理中の状況をStatusLabelに表示させる方法

このQ&Aのポイント
  • C#で処理中の状況をStatusLabelに表示させるためには、マルチスレッドを使用する必要があります。
  • 以下のコードを使用して、10秒ごとにStatusLabelに数字を表示することができます。
  • しかし、問題はマルチスレッドで時間のかかる処理を実行し、その結果をStatusLabelに反映させる方法です。具体的なコード例は提供されていませんが、マルチスレッドと非同期処理を組み合わせることで解決できる可能性があります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

まず,Loadイベントは表示前に発生するので,Loadで一生懸命表示をいろいろ切り替えても, Loadイベントが終わらないと表示されなかったりします。 一応,Shownイベントであれば,初回表示後なので, Application.DoEventsかませば表示は切り替わります。 ただし,この方法は推奨しません。 Application.DoEventsが必要になった場合,「何かがおかしい」と思った方が良いです。 今回の場合であれば,スレッドよりもタイマーを使って, 処理を分解してしまった方がよい気もします。 # GUIスレッドでSleep使う場合は,通常タイマーを使った状態遷移に修正可能です。 スレッドを使うなら,BackgroundWorkerを使うのが簡単です。 Form1にBackgroundWorkerを貼り付け, ・WorkerReportsProgressプロパティの値をtrueにする ・DoWorkイベントハンドラに, for (int i = 0; i < 10; ++i) { (BackgroundWorkerの名前).ReportProgress(i); Thread.Sleep(1000); } を記述する ・ProgressChangedイベントハンドラに, toolStripStatusLabel1.Text = e.ProgressPercentage.ToString(); を記述する ・Form1のLoadイベントハンドラに, (BackgroundWorkerの名前).RunWorkAsync(); を記述する で,望む動作になると思います。 他にも,Threadクラスを使ったり,デリゲートのBeginInvokeメソッドを使ったり, Taskクラスを使ったりする方法がありますが,UIへの表示部分がややこしくなるため, 最初はBackgroundWorkerを使うのがよいと思います。 References) MSDN: BackgroundWorker コンポーネント http://msdn.microsoft.com/ja-jp/library/c8dcext2.aspx MSDN: BackgroundWorker クラス http://msdn.microsoft.com/ja-jp/library/system.componentmodel.backgroundworker.aspx Blog: Part 4. Visual Studio によるマルチスレッドアプリの開発 - とあるコンサルタントのつぶやき - Site Home - MSDN Blogs http://blogs.msdn.com/b/nakama/archive/2009/04/09/part-4-visual-studio.aspx おまけ) Taskを使う (.NET 4以降) // using System.Threading.Tasks; private void Form1_Load (object sender, EventArgs e) { Task.Factory.StartNew(() => { for (var i = 0; i < 10; ++i) { Invoke((Action)(() => toolStripStatusLabel1.Text = i.ToString()); Thread.Sleep(1000); } }); // var task = new Task(...); task.Start(); }

noname#207939
質問者

お礼

丁寧に説明していただき、ありがとうございました。 やってみます。

その他の回答 (1)

回答No.1

こんにちは。 とりあえず、BackgroundWorker というキーワードで調べてみてください。 提示されているコードでは、Threadの概念自体が理解できてないようですので、もう少し自分で調べた方が、身に付くかと思います・・・。

noname#207939
質問者

お礼

まずBackgroundWorkerを勉強してみます。 ヒントをいただけて助かりました、ありがとうございました。

関連するQ&A

専門家に質問してみよう