アプリ版:「スタンプのみでお礼する」機能のリリースについて

C#でバックグラウンドワーカーを使用した時間表示の処理を行っております。
アプリケーションが起動している時は良いのですが、終了時に(1)の所で次のようなメッセージが出ます。
「破棄されたオブジェクトにアクセスする事は出来ません。」
「オブジェクトForm1です」
エラーを無くす方法についてご存知のかたいらっしゃいましたらご教授頂けないでしょうか。

//バックグラウンド処理の開始
private void Form1_Shown(object sender, EventArgs e) {
  BackGroundWorker1.RunWorkerAsync(); //バックグラウンド処理開始
}

//バックグラウンド処理
private void BackGroundWorker1_DoWork(object sender, DoWorkEventArgs e) { 
 while (true){
Invoke(new SetTextDelegate(SetTime));//テキスト描画・・・・・(1)
}
}

//バックグラウンドから呼び出されるデリゲート関数
delegate void SetTextDelegate();
void SetTime() {
   //時間の表示
label1.Text = DateTime.Now.ToString("日時:yyyy年MM月dd日 HH:mm:ss");
}

A 回答 (1件)

InvokeメソッドはFormクラスのメンバ関数です。



Invokeが呼べるのはForm1オブジェクトが生きている間のみです。

bool GoBackGround = true;

など、フラグを作っておいて、FormClosingあたりでGoBackGround = false;にします。

で、

while (GoBackGround){
Invoke(new SetTextDelegate(SetTime));//テキスト描画・・・・・(1)
}

とかやれば、Form1がクローズ(破棄)されるとInvokeが呼ばれない為、エラーが出なくなるでしょう。

てゆ~か、アプリ終了時に、自分が作成したスレッドやバックグラウンドを放置して修了するのは、やっちゃいけないと思います。

アプリ内で作成したスレッドやバックグラウンドは、修了前に「自分で後始末」しましょう。

つまり「修了前に、スレッドやバックグラウンドを自分で破棄しないと駄目」です。

ちゃんと自分で破棄すれば、変なエラーは出ませんし、上記のようなフラグ操作も要りません。
    • good
    • 0
この回答へのお礼

ご回答頂きありがとうございます。
ご教授頂いたとおり修正した所解決しました。

内容といたしましては次のようになりました。
(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();・・・・・・・・・・・・・(追加)※重要
}

以上、助かりました。
ありがとうございます。

お礼日時:2011/12/06 14:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!