質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

5028閲覧

Backgroudworkerを用いて処理キャンセルする際、画面の閉じるボタン(×ボタン)押下時の実現方法について教えてください。

zanac

総合スコア25

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2016/11/28 05:54

編集2016/11/28 06:01

###前提・実現したいこと
大量のファイルコピーをコピーする際、進捗ダイアログを表示するダイアログを作成しようとしています。
進捗ダイアログは、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(); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

キャンセルボタンが押されたときも
閉じるボタンが押されたときも
同じ処理の流れになるようにしたほうがいいと思います。

閉じるボタンが押されたら
とりあえず e.Cancel = true で閉じる処理をキャンセル、
_backgroundWorker.CancelAsync() をコールしてキャンセル処理を要求します。

_backgroundWorker が正常に終了するにしろキャンセルで終了するにしろ、
最終的にはダイアログを閉じる処理を記述していると思うので、
閉じる処理がされた場合はとりあえずキャンセルを要求するだけでいいのではないでしょうか。

Closing イベントハンドラの中では
_backgroundWorker.IsBusy プロパティなどを見て
e.Cancel = true するかどうか分岐させておけばいいでしょう。

投稿2016/11/28 06:04

twyujiro15

総合スコア217

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zanac

2016/11/28 11:37

ご回答ありがとうございます! twyujiro15さんの回答にありました、 「 Closing イベントハンドラの中では _backgroundWorker.IsBusy プロパティなどを見て e.Cancel = true するかどうか分岐させておけばいいでしょう。 」 を対応しましたら、意図通り、キャンセル後の処理が対応できました!! 大変助かり、感無量です!! ありがとうございました!!今後ともよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問