c# - 取消通过 System.Diagnostics.Process.Start() 启动的进程

标签 c#

我正在编写一个应用程序,其中有一个进程在 BackgroundWorker 中运行。我想支持从用户界面取消,但我没有找到执行此操作的简单方法。

Process 实际上是一个运行时间相当长的命令行 exe。输出通过 Progress.OutputDataReceived 事件异步重定向,并用于向 GUI 报告进度。

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
    using (var process = new Process())
    {
        //...

        process.Start()

        //...

        process.WaitForExit();
    }
}

private void CancelWorker()
{
    worker.CancelAsync();
    // where to actually listen for the cancellation???
}

除了 StandardInput 之外,似乎没有办法让进程“监听”来自主线程的任何输入,但除非应用程序本身响应,否则这不会起作用到特定输入以中止。

有没有办法根据主线程的取消请求取消进程?

对于进程中运行的 EXE,我可以调用 Process.Close() 退出而不会产生任何副作用,但是 Process对象只为 worker_DoWork() 方法所知,因此我需要跟踪 Process 实例以用于取消目的...这就是我希望存在的原因可能是更好的方法。

(如果重要的话,我的目标是 .NET 3.5 以解决兼容性问题。)

最佳答案

合作取消需要监听BackgroundWorker.CancellationPendingBackgroundWorker.DoWork 事件。

How to: Use a Background Worker

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
    using (var process = new Process())
    {
        //...

        process.Start()

        //...
        while(true)
        { 
            if ((sender as BackgroundWorker).CancellationPending && !process.HasExited)
            {
              process.Kill();
              break;
            }
            Thread.Sleep(100);
         }

        process.WaitForExit();
    }
}

关于c# - 取消通过 System.Diagnostics.Process.Start() 启动的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14096545/

相关文章:

c# - HTML Agility Pack 选择具有多个属性的节点

c# - XSLT 转换创建 StackoverflowException

c# - 控制不透明度

c# - 使用Linq检查List <List <int> []>是否包含值

c# - 如何获取 Stream 的底层文件句柄?

c# - 将 JSON 对象与 webjobs SDK 和 Azure 队列结合使用

c# - 帮助使用 Linq 查询 XML

C# 服务器向 Java 客户端发送 UDP 数据包

c# - 来自 Entity Framework 的提供程序连接字符串

javascript - 如何使用 angularjs 和特定的数据结构创建简单的树可折叠/可折叠 View