2

わかりました、私は使用しています: C# と Windows フォーム

私はバックグラウンドワークを持っています。ここで、キャンセル ボタンを作成したいと思いましたが、キャンセルするように指示し、バックグラウンドワークがそれを受け入れても、トリガーする実行可能ファイルを実行し続けます。

次のコードでキャンセルボタンがあります

private void cancelBackup_Click(object sender, EventArgs e)
    {
        backgroundWorker1.CancelAsync();
        displayResults.Text = "Operation Cancelled";

    }

バックグラウンド ワーカーのコードは次のとおりです。

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        String invoer = comboboxDriveLetter.Text;
        invoer = invoer.Remove(2);

        ProcessStartInfo pStartInfo = new ProcessStartInfo("C:\\windows\\system32\\wbadmin.exe", " START BACKUP -backuptarget:" + invoer + " -include:c: -AllCritical -quiet");

        pStartInfo.CreateNoWindow = true;
        pStartInfo.UseShellExecute = false;
        pStartInfo.RedirectStandardInput = true;
        pStartInfo.RedirectStandardOutput = true;
        pStartInfo.RedirectStandardError = true;

        Process process1 = new Process();

        process1.OutputDataReceived += new DataReceivedEventHandler(OutputHandler);
        process1.ErrorDataReceived += new DataReceivedEventHandler(ErrorHandler);
        pStartInfo.Verb = "runas";
        process1.StartInfo = pStartInfo;
        process1.SynchronizingObject = displayResults;

        process1.Start();
        process1.BeginOutputReadLine();


        process1.WaitForExit();
    }

ボタンをクリックしてキャンセルすると、アクションは実行されますが、リッチテキストボックスにすべてが表示されるため、バックアップは続行されます

操作がキャンセルされましたバックアップに指定された
ボリュームのシャドウ コピーを作成しています... バックアップに指定された
ボリュームのシャドウ コピーを作成しています... バックアップに指定されたボリュームのシャドウ コピーを作成しています... バックアップに指定されたボリューム
のシャドウ コピーを作成しています...
ボリューム SYSTEM (1.99 GB) のバックアップが正常に完了しました。
ボリューム OS(C:) のバックアップを作成しています。コピー済み (0%)。
ボリューム OS(C:) のバックアップを作成しています。コピー済み (0%)。
ボリューム OS(C:) のバックアップを作成し、コピーしました (8%)。
ボリューム OS(C:) のバックアップを作成し、コピーしました (55%)。
ボリューム OS(C:) のバックアップを作成し、コピーしました (82%)。
ボリューム OS(C:) のバックアップが正常に完了しました。
バックアップ操作は正常に完了しました。
バックアップ操作の概要:
------------------
ボリューム SYSTEM (1.99 GB) のバックアップが正常に完了しました。
ボリューム OS(C:) のバックアップが正常に完了しました。

私は何を間違っていますか?

4

1 に答える 1

1

BackgroundWorker のキャンセルは協力的です。つまり、DoWork 内のコードは定期的にフラグをチェックし、要求されたときに終了する必要があります。

process1.Start();もちろん、そのフラグには応答しません。

process1.Kill();[キャンセル] ボタンから呼び出すこともできますが、それがスレッドセーフかどうかはわかりません。

だからおそらくこれ:

//process1.WaitForExit();
while (! process1.WaitForExit(100))
{
    if (bgw.CancellationPending)
    {
       e.cancel = true;
       process1.Kill();
    }
}
于 2013-08-15T09:27:38.267 に答える