2

次の状況でバックグラウンドワーカーをキャンセルする方法を見つけようとしています:

ある Winform には、基本的にサービスから大量のデータを取得するバックグラウンド ワーカーがあります。この操作には 1 秒から 5 分かかります。それで、私がしたことは、別の Winform を作成し、それにマーキー プログレス バーを貼り付けることでした。

私がやりたいのは、バックグラウンドワーカーをキャンセルするプログレスバーを備えたそのWinformにキャンセルボタンを追加することです。

私の現在のコードは次のように設定されています:

this.backgroundWorker1.RunWorkerAsync();
pb = new frmProgressbar();
pb.Show();

while (this.backgroundWorker1.IsBusy)
{
   Application.DoEvents();
}

pb.Dispose();

そのため、バックグラウンドワーカーが作業している間にプログレスバーを表示し、その後プログレスバーフォームを破棄するため、これは正常に機能します。

しかし、バックグラウンド ワーカーを強制終了するキャンセルを返す frmProgressbar に [キャンセル] ボタンを配置して、ユーザーが操作をキャンセルできるようにする方法を見つける必要があります。助言がありますか?

4

1 に答える 1

1

プログレス バー フォームにイベントを追加してキャンセルが発生したことを示し、関連するボタンがクリックされたときにイベントを発生させることから始めます。

public class frmProgressbar : Form
{
    public event Action Canceled;

    void btnCancel_Click(object sender, EventArgs e)
    {
        if (Canceled != null)
            Canceled();
    }

    //other stuff
}

次に、他のフォームで新しいプログレス バーを作成し、バックグラウンド ワーカー (独自のキャンセル サポートが組み込まれています) をキャンセルしてから表示できます。完了したイベントにハンドラーを追加して、進行状況バーを閉じることもできます (BGW で待機するのではなく)。次にワーカーを起動します。

DoWorkまた、キャンセルが要求された場合に作業を停止できるように、ハンドラー全体からキャンセルを確認する必要があります。

var pb = new frmProgressbar();
pb.Canceled += ()=> backgroundWorker1.CancelAsync();
pb.Show();

backgroundWorker1.RunWorkerCompleted += (s, args) => pb.Close();
backgroundWorker1.RunWorkerAsync();
于 2013-10-23T20:02:11.193 に答える