0

私はさまざまなことを試してきましたが、このコードを機能させることができません。バックグラウンドワーカーを停止してからウィンドウを閉じる私のコード。

protected override void OnFormClosing(FormClosingEventArgs e)
    {
        if (bw.IsBusy)
        {
            bw.CancelAsync();
            e.Cancel = true;
            MessageBox.Show("close"); //Does show
            return;
        }
        base.OnFormClosing(e);
    }

bw ワーカー中

if (worker.CancellationPending)
        {
            MessageBox.Show("Cancel"); // Does not show
            //Cancel
            e.Cancel = true;
        }

完了したバックグラウンド ワーカーについて

private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        MessageBox.Show("Completed"); //Does not work

        //Check if restart
        if (bw_restart)
        { 
            bw_restart = false;
            bw.RunWorkerAsync();

        }
        //If it was cancelled
        if (e.Cancelled)
        {
            this.Close();
        }
        //If error show error message
        else if (e.Error != null)
        {
            MessageBox.Show(e.Error.ToString()); // Does not show
        }
        else //No errors or cancelled
        {
            MessageBox.Show(e.ToString()); //Does not shoiw
        }

    }

キャンセルボタン

private void cancel_Click(object sender, EventArgs e)
    {
        bw.CancelAsync(); //Does not work :s
    }

ウィンドウを閉じません.Xを押しても何もしません.フォームを閉じましたが、バックグラウンドワーカーを停止せず、少し怒っていました. この問題が機能しないために取得したコードへのリンク: How to stop BackgroundWorker on Form's Closing event?

4

3 に答える 3

2
   if (e.Cancelled)

それは根本的に間違っています。設定されることを 100% 確信することはできません。BGW のキャンセルは常に競合状態です。CancelAsync() メソッドを呼び出したときに BGW が終了でビジーだった可能性があるため、CancellationPending が true に設定されていないため、DoWork イベント ハンドラーで e.Cancel = true が割り当てられていません。

事実としてわかっているのは、UI スレッドで true に設定されているため、mClosePending が信頼できるということだけです。そのため、e.Cancelled の状態に関係なく、true に設定されている場合は常に Close() を呼び出します。

はい、e.Error をチェックしても害はありません。ただし、mClosePendingを確認してください。

于 2013-06-17T19:14:58.233 に答える
1

私のコメントで述べたように、エラーが原因で BackgroundWorker が終了しました。run worker completed の先頭に以下を追加してみてください。このエラーが解決されると、あなたの質問はより回答しやすくなります。

if(e.Error != null)
     MessageBox.Show(e.Error.toString());//Put a breakpoint here also
于 2013-06-17T19:07:08.207 に答える