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

时间:2016-11-30 12:20:00

标签: c# batch-file process streamreader

问题:我遇到一个问题,我无法使用processName.Kill()

立即停止在C#app(进程)内运行的批处理文件

在我的项目中,批处理文件将运行几个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

我正在使用共享取消令牌源中的取消令牌,并在2000秒后取消。我已将以下事件附加到令牌:

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循环。

我尝试通过在每次进程输出接收到新数据时引发事件来执行此操作但是我无法将它们同步以正确的顺序运行,因为脚本倾向于同时转储数百行输出

由于

1 个答案:

答案 0 :(得分:0)

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

我想这是因为命令timeout在这里很麻烦。我曾经尝试使用命令提示符杀死timeouting批处理,并且发生的过程与上述相同。 timeouting完成之前,该批次将无法终止。

  

也许您可以在杀死该批次后尝试使用Process.Kill("timeout.exe")


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