###前提・実現したいこと
大量のファイルコピーをコピーする際、進捗ダイアログを表示するダイアログを作成しようとしています。
進捗ダイアログは、backgroudworkerで実現し、ダイアログにキャンセルボタンを設けて、そのボタンを押下すると、
コピーをキャンセルするようにしたいです。
キャンセルボタン押下と閉じるボタン(ダイアログの右上の×ボタン)押下は同一のキャンセル処理を行いたいのですが、
デバッグで処理の流れを確認すると、以下の様な流れでした。
①
キャンセルボタン押下
↓
DoWorkイベント(CancellationPending==true)
↓
RunWorkerCompletedイベント(ここで独自処理を記載)
↓
Closingイベント
↓
ダイアログ閉じる
②
閉じるボタン(ダイアログの右上の×ボタン)押下
↓
Closingイベント
↓
ダイアログ閉じる
↓
DoWorkイベント(CancellationPending==true)
↓
RunWorkerCompletedイベント
処理の流れが異なるのですが、
閉じるボタン(×ボタン)押下の処理は、キャンセルボタン押下と同一実装では実現できないのでしょうか?
以下、現状の実装を記載いたします。
この実装では、閉じるボタンを押下すると、ダイアログが閉じる前にやってほしいRunWorkerCompletedイベントが
処理されず、意図した動作をしてくれません。
恐縮ですがご教授お願いいたします。
###該当のソースコード
C#
//コンストラクタ public Copying() { _backgroundWorker.DoWork += new DoWorkEventHandler(Worker_DoWork); _backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(Worker_ProgressChanged); _backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted); // 進捗状況の報告をできるようにする _backgroundWorker.WorkerReportsProgress = true; // キャンセル処理をできるようにする _backgroundWorker.WorkerSupportsCancellation = true; // バックグラウンド処理の実行 _backgroundWorker.RunWorkerAsync(); } // コピー処理 void Worker_DoWork(object sender, DoWorkEventArgs e) { if (_backgroundWorker.CancellationPending) { // キャンセル処理 e.Cancel= true break; } // 実際のコピー処理 } // キャンセルボタンクリック private void Cancel_Click(object sender, RoutedEventArgs e) { if( true == _backgroundWorker.IsBusy) { // キャンセル要求 _backgroundWorker.CancelAsync(); } } // 処理が完了 void Worker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) { if ( true == e.Cancelled) { //キャンセルが押下された場合の処理 } } // 閉じるボタン(×ボタン)押下された(キャンセルボタンクリックと同じ処理) private void Closing_Click(object sender, CancelEventArgs e) { if (true == _backgroundWorker.IsBusy) { // キャンセル要求 _backgroundWorker.CancelAsync(); } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/28 11:37