【问题标题】:BackGroundworker Cancelation not working for wbadmin.exeBackGroundworker Cancellation 不适用于 wbadmin.exe
【发布时间】:2013-08-17 11:16:44
【问题描述】:

好的,我正在使用: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 最终会显示整个内容

操作已取消正在创建指定用于备份的卷的卷影副本...
创建指定用于备份的卷的卷影副本...
创建指定用于备份的卷的卷影副本...
创建指定用于备份的卷的卷影副本...
卷 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:) 的备份已成功完成。

我做错了什么?

【问题讨论】:

    标签: c# windows forms backgroundworker cancellation


    【解决方案1】:

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

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

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

    大概是这样的:

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

    【讨论】:

    • 好的,但同时我有个更好的主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多