- ベストアンサー
C#で処理中の状況をStatusLabelに表示させる方法
- C#で処理中の状況をStatusLabelに表示させるためには、マルチスレッドを使用する必要があります。
- 以下のコードを使用して、10秒ごとにStatusLabelに数字を表示することができます。
- しかし、問題はマルチスレッドで時間のかかる処理を実行し、その結果をStatusLabelに反映させる方法です。具体的なコード例は提供されていませんが、マルチスレッドと非同期処理を組み合わせることで解決できる可能性があります。
- みんなの回答 (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(); }
その他の回答 (1)
- taka451213
- ベストアンサー率47% (436/922)
こんにちは。 とりあえず、BackgroundWorker というキーワードで調べてみてください。 提示されているコードでは、Threadの概念自体が理解できてないようですので、もう少し自分で調べた方が、身に付くかと思います・・・。
お礼
まずBackgroundWorkerを勉強してみます。 ヒントをいただけて助かりました、ありがとうございました。
お礼
丁寧に説明していただき、ありがとうございました。 やってみます。