C# BackGroundworker取消不适用于wbadmin.exe

C# BackGroundworker取消不适用于wbadmin.exe,c#,windows,forms,backgroundworker,cancellation,C#,Windows,Forms,Backgroundworker,Cancellation,好的,我将:C#与Windows窗体一起使用 我有一个背景,这是可行的。现在我想创建一个取消按钮,但即使我告诉它取消并且后台工作接受了,它仍会继续运行它触发的可执行文件 我有一个带有以下代码的取消按钮 private void cancelBackup_Click(object sender, EventArgs e) { backgroundWorker1.CancelAsync(); displayResults.Text = "Operation C

好的,我将: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();
    }
当我单击按钮取消时,它会执行整个操作,但备份会继续,因为richtextbox最终会显示整个内容

操作已取消创建指定用于备份的卷的卷影副本…
正在创建指定用于备份的卷的卷影副本…
正在创建指定用于备份的卷的卷影副本…
正在创建指定用于备份的卷的卷影副本…
卷系统(1.99 GB)的备份已成功完成。
正在创建卷操作系统(C:)的备份,已复制(0%)。
正在创建卷操作系统(C:)的备份,已复制(0%)。
正在创建卷操作系统(C:)的备份,已复制(8%)。
正在创建卷操作系统的备份(C:),已复制(55%)。
正在创建卷操作系统(C:)的备份,已复制(82%)。
卷操作系统(C:)的备份已成功完成。
备份操作已成功完成。
备份操作摘要:
------------------
卷系统(1.99 GB)的备份已成功完成。
卷操作系统(C:)的备份已成功完成。


我做错了什么?

取消BackgroundWorker是合作的。这意味着DoWork中的代码应该定期检查标志,并在请求时退出

process1.Start()当然不会响应该标志

您可以尝试调用
process1.Kill()从取消按钮,但我不确定这是否线程安全

所以可能是这样的:

//process1.WaitForExit();
while (! process1.WaitForExit(100))
{
    if (bgw.CancellationPending)
    {
       e.cancel = true;
       process1.Kill();
    }
}

好的,但同时我有一个更好的主意。