質問: environment.tickcount.tostring(); })); } } private void handleclosingevent(object sender, canceleventargs e) { this.bgworker.cancelasync(); /////// while (this.bgworker.cancellationpending) {} // deadlock }
回答: ここに私の解決策がありました(vb.netにあります)。formclosingイベントを実行するとき、backgroundworker1.cancelasync()を実行してcancellationpending値をtrueに設定します。残念ながら、プログラムは実際に値cancellationpendingの値を確認してe.cancelをtrueに設定する機会を得ることができません(私が知る限り、backgroundworker1_doworkでのみ実行できます)。私はその行を削除しませんでしたが、実際には違いを生むようには見えません。グローバル変数bclosingformをtrueに設定する行を追加しました。次に、終了ステップを実行する前に、backgroundworker_workcompletedにコード行を追加して、e.cancelledとグローバル変数bclosingformの両方をチェックしました。このテンプレートを使用すると、バックグラウンドワーカーが何かの途中にいる場合でも、いつでもフォームを閉じることができるはずです(これは良くないかもしれませんが、処理される可能性があるため、発生するはずです)。必要かどうかはわかりませんが、これがすべて行われた後、form_closedイベントに完全にバックグラウンドワーカーを配置できます。private bclosingform as boolean = false private sub someformname_formclosing(byval sender as object, byval e as system.windows.forms.formclosingeventargs) handles me.formclosing bclosingform = true backgroundworker1.cancelasync() end sub private sub backgroundworker1_dowork(byval sender as object, byval e as system.componentmodel.doworkeventargs) handles backgroundworker1.dowork 'run background tasks: if backgroundworker1.cancellationpending then e.cancel = true else 'background work here end if end sub private sub backgroundworker1_runworkercompleted(byval sender as system.object, byval e as system.componentmodel.runworkercompletedeventargs) handles backgroundworker1.runworkercompleted if not bclosingform then if not e.cancelled then 'completion work here end if end if end sub