gpt4 book ai didi

C# process.Kill 不会立即停止正在运行批处理文件的进程

转载 作者:行者123 更新时间:2023-11-30 12:56:27 25 4
gpt4 key购买 nike

问题:我遇到一个问题,我无法使用 processName.Kill() 立即停止在 C# 应用程序(进程)内运行的批处理文件。

在我的项目中,批处理文件将运行多个 python 脚本,总共需要大约 30 分钟才能完成。它会偶尔将几行输出转储到控制台,我正在使用相关进程的标准输出捕获这些输出。

我正在设置并开始这样的过程:

var process = new Process
{
StartInfo = new ProcessStartInfo
{
UseShellExecute = false,
FileName = @"C:\Test.bat",
WorkingDirectory = @"C:\",
RedirectStandardOutput = true,
},
};
process.Start();

我正在测试的批处理文件非常简单:

echo starting
timeout /t 4
echo it worked

我正在使用来自共享取消 token 源的取消 token 并在 2000 秒后取消。我已将以下事件附加到 token :

ct.Register(() =>
{
process.Kill();
});

我将 standardOutput 逐行发送到字符串的阻塞集合,如下所示:

Task.Factory.StartNew(() =>
{
while (!streamReader.EndOfStream)
{
var line = streamReader.ReadLine();

if (line == null) break;

_blockingCollection.Add(line);
}

_blockingCollection.CompleteAdding();
});

我期望发生的事情:因为进程已被取消标记引发的事件终止,所以我期望 streamReader.Readline()方法立即返回 null 或抛出异常。相反,它等待批处理文件中的超时完成,然后返回超时打印的完整行。在我的实际应用程序中,可能需要等待 10-15 分钟才能获得脚本的下一个输出。

我是不是误解了 process.Kill()作品?超时行为是否奇怪?在理想情况下,我希望流阅读器立即停止阅读并跳出 while 循环。

我尝试通过每次进程输出接收到新数据时都引发一个事件来做到这一点,但是我无法同步这些以正确的顺序运行,因为脚本倾向于同时转储数百行输出

谢谢

最佳答案

(对不起,我不能发表评论。)

我猜是因为命令:timeout 在这里很麻烦。我曾经尝试使用命令提示符终止 timeouting 批处理,结果与上述相同。在 timeouting 完成之前,批处理无法终止。

Maybe you can try for Process.Kill("timeout.exe") after killing the batch.


对不起,如果我误解了你的问题。我只是这里的新手。

关于C# process.Kill 不会立即停止正在运行批处理文件的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40888221/

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