gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:32:48 30 4
gpt4 key购买 nike

我正在编写一个应用程序,其中有一个进程在 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com