###前提・実現したいこと
BackgroundWorkerを使い、プログレスバーを作っています。
プログレスバー呼び出し先のダイアログから、複数回プログレスバーを呼び出す処理を作りたいと考えています。(プログレスバーは1つで、プログレスバー内で複数の処理がある)
プログレスバー内のスレッドが2回目の呼び出し以降、動かなくて困っています。
デバック方法や、進め方について、アドバイスを頂きたいです。
宜しくお願い致します。
###発生している問題・エラーメッセージ
特にエラーメッセージは出ていません。(Windowsイベントビューアー含み)
現在困っていることは、同じダイアログから2回目以降、プログレスバーを呼び出すと、バックグランドワーカーのスレッドが動かずに、処理が終わってしまっています。
厄介なことに、デバッカでは症状が発生せず、デバッカが入っていないPCにて動作をさせると、症状が出ます。処理の先頭にLogを出力しており、そのLogが確認出来ない事から、処理が実行されずに、終了されているものと考えています。暫くすると、同じことをやっているのに、処理がされるようになり、Logも正常に書き込まれます。
下記ソースコードに記載させて頂いた「スレッド開始」が記載ず、終了しています。
###該当のソースコード
呼び出し側
C#
1ProgressForm pr = new ProgressForm(); 2pr.progress_Type = (int)ProgressForm.progressModeType.SETTING_MANU;//プログレスバーのモード指定 3pr.ShowDialog();
プログレスバー側
C#
1 private void timer1_Tick(object sender, EventArgs e) 2{ 3 if (start_copy) 4 { 5 start_copy = false; 6 7 // バックグラウンドワーカーの設定. 8 WorkerCopy = new System.ComponentModel.BackgroundWorker(); // オブジェクト作成. 9 WorkerCopy.DoWork += new System.ComponentModel.DoWorkEventHandler(Worker_DoCopyWork); // メインの処理. 10 WorkerCopy.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(Worker_CopyProgressChanged); // プログレスバーカウントアップ. 11 WorkerCopy.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(Worker_CopyWorkerCompleted); // 終了処理. 12 13 WorkerCopy.WorkerReportsProgress = true; // 進捗状況の確認. 14 WorkerCopy.RunWorkerAsync(); // バックグラウンドワーカースタート. 15 } 16} 17 18 19void Worker_DoCopyWork(object sender, System.ComponentModel.DoWorkEventArgs e) 20{ 21 log.writing(progGetLogPath, " ********** スレッド開始 ********** "); 22 23 //時間のかかる処理 24 25 log.writing(progGetLogPath, " ********** スレッド終了 ********** "); 26} 27 28void Worker_CopyWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) 29{ 30 WorkerCopy.Dispose(); 31 32 // エラーメッセージ等の終了時の処理 33} 34
###試したこと
WorkerCopy.Dispose()を「Worker_CopyWorkerCompleted」に追加してみましたが、効果はありませんでした。。
また、プログレスバーが閉じられる時に、リソースは全て解放されると認識していましたので、呼び出し側のダイアログを終了させる事や、pr.Dispose()等での開放もしてみましたが、効果がありませんでした。
ご指摘を受け調査した所、Log出力の為のLogクラスに問題がある事が分かりました。上記記載したクラスのどれでもありませんでした。
下記がLogクラス内のコードなのですが、logFileがアクセス出来ない状態になっている場合があります。しかし、、書き込み後にしっかりと開放していると思うのですが・・・下記書かたが悪いのでしょうか。
C#
1class AddLog 2{ 3 public void writing(string logFile, string msg) 4 { 5 if (log_path == "") 6 return; 7 8 //現在時刻 9 DateTime dt = DateTime.Now; 10 11 //書き込み 12 try 13 { 14 using (StreamWriter sw = new StreamWriter(logFile, true, Encoding.GetEncoding("shift_jis"))) 15 { 16 string str = dt.ToString("[yyyy-MM-dd-HHmmss]") + " " + msg + "\r\n"; 17 sw.Write(str); 18 sw.Close(); 19 } 20 21 //StreamWriter sw = new StreamWriter(logFile, true, Encoding.GetEncoding("shift_jis")); 22 //string str = dt.ToString("[yyyy-MM-dd-HHmmss]") + " " + msg + "\r\n"; 23 //sw.Write(str); 24 //sw.Close(); 25 } 26 catch (Exception ex) 27 { 28 System.Windows.Forms.MessageBox.Show(ex.Message.ToString()); 29 Console.WriteLine(ex.Message.ToString()); 30 } 31} 32
###補足情報(言語/FW/ツール等のバージョンなど)
開発環境:Visual Studio2015
開発環境OS:Windows7 64bit
発生環境:Windows8.1