• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C#でバックグラウンド処理からテキスト描画)

C#バックグラウンド処理からテキスト描画

このQ&Aのポイント
  • C#でバックグラウンドワーカーを使用した時間表示の処理を行い、終了時にエラーメッセージが出る問題について解決方法を教えてください。
  • バックグラウンド処理中に「破棄されたオブジェクトにアクセスする事は出来ません。」というエラーメッセージが表示されます。
  • バックグラウンド処理の開始時にバックグラウンドワーカーを実行し、定期的に時間を表示する処理を行っていますが、終了時にエラーメッセージが出ています。エラーの解決方法を教えてください。

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

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

InvokeメソッドはFormクラスのメンバ関数です。 Invokeが呼べるのはForm1オブジェクトが生きている間のみです。 bool GoBackGround = true; など、フラグを作っておいて、FormClosingあたりでGoBackGround = false;にします。 で、 while (GoBackGround){ Invoke(new SetTextDelegate(SetTime));//テキスト描画・・・・・(1) } とかやれば、Form1がクローズ(破棄)されるとInvokeが呼ばれない為、エラーが出なくなるでしょう。 てゆ~か、アプリ終了時に、自分が作成したスレッドやバックグラウンドを放置して修了するのは、やっちゃいけないと思います。 アプリ内で作成したスレッドやバックグラウンドは、修了前に「自分で後始末」しましょう。 つまり「修了前に、スレッドやバックグラウンドを自分で破棄しないと駄目」です。 ちゃんと自分で破棄すれば、変なエラーは出ませんし、上記のようなフラグ操作も要りません。

flowergoo
質問者

お礼

ご回答頂きありがとうございます。 ご教授頂いたとおり修正した所解決しました。 内容といたしましては次のようになりました。 (1)bool GoBackGround = true;を追加 (2)FormClosingにGoBackGround = false;を追加  ※この行のあとにApplication.DoEvents();を追加 (3)while (GoBackGround)とする //バックグラウンド処理の開始 private void Form1_Shown(object sender, EventArgs e) {   GoBackGround = true;・・・・・・・・・・・・・・・(追加)   BackGroundWorker1.RunWorkerAsync(); //バックグラウンド処理開始 } //バックグラウンド処理 private void BackGroundWorker1_DoWork(object sender, DoWorkEventArgs e) {   while (GoBackGround){・・・・・・・・・・・・・・(trueからGoBackGroundに変更) Invoke(new SetTextDelegate(SetTime));//テキスト描画・・・・・(問題が起きていた箇所) } } //バックグラウンドから呼び出されるデリゲート関数(この関数は変更無し) delegate void SetTextDelegate(); void SetTime() {    //時間の表示 label1.Text = DateTime.Now.ToString("日時:yyyy年MM月dd日 HH:mm:ss"); } // 閉じる前に呼ばれる private void Form1_FormClosing(object sender, FormClosingEventArgs e) { GoBackGround = false;・・・・・・・・・・・・・・・(追加) Application.DoEvents();・・・・・・・・・・・・・(追加)※重要 } 以上、助かりました。 ありがとうございます。

関連するQ&A