当您覆盖“sfc /scannow”命令的输出时,其输出会中断。根据标准,控制台中的输出为 1%..100%,但是当被覆盖时,第一个通知最常出现在 46% 处,并且大量先前的通知立即到达 - 1%..46%。然后又是沉默,又是 91% 和 100% 的通知。此外,这恰恰发生在“sfc /scannow”。另一个命令“ping ya.ru -t”工作正常。
我想以某种方式通知用户进度,而不是等大约一分钟直到 46%,然后再等一分钟,立即 91%、100% 和最终输出......
static async Task Main(string[] args)
{
ProcessStartInfo proc = new()
{
FileName = "sfc",
Arguments = "/scannow",
RedirectStandardOutput = true
};
Process process = new()
{
StartInfo = proc
};
process.Start();
process.OutputDataReceived += Process_OutputDataReceived;
process.BeginOutputReadLine();
await process.WaitForExitAsync();
Console.ReadLine();
}
private static void Process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
if (!string.IsNullOrEmpty(e.Data) && e.Data != "\0")
{
Console.WriteLine(e.Data);
}
}
但如果将命令更改为另一个命令,输出将正常工作。
ProcessStartInfo proc = new()
{
FileName = "ping",
Arguments = "ya.ru -t",
RedirectStandardOutput = true
};
您的问题在于如何重定向来自标准输出的流。
这是通过具有缓冲的管道完成的(例如,在您的情况下是 4kb),如果正在运行的进程没有处理刷新缓冲区,那么您将不得不等待它溢出或进程结束(此处是更详细的答案https://stackoverflow.com/questions/20503671/ python-c-program-subprocess-hangs-at-for-line-in-iter)
要解决该问题,您可以尝试通过所谓的运行该过程。伪终端 - pty。对于.net,我只见过一种实现,并且它在nuget中没有包,它是Pty.Net(https://github.com/microsoft/vs-pty.net)