进程输出捕获非常缓慢

本文关键字:非常 缓慢 输出 进程 | 更新日期: 2023-09-27 18:30:00

我目前正在运行以下代码,以测试外部应用程序是否真的在使用我的dll(更新程序代码)

 ProcessStartInfo psi = new ProcessStartInfo()
 {
      FileName = "Tasklist.exe",
      Arguments = @"/m MyServices.dll",
      CreateNoWindow = true,
      RedirectStandardOutput = true,
      UseShellExecute = false
 };
 Process p = new Process();
 p.StartInfo = psi;
 p.Start();
 //debug output box, just to see everything that returns
 txtOutput.Text = p.StandardOutput.ReadToEnd();
 p.WaitForExit();
 Refresh();
 if (txtOutput.Text.Contains("TestProgram.exe"))
      MessageBox.Show("Found It");

现在,这个代码工作!!!。。。。但速度很慢。我可以在cmd窗口中键入相同的命令,并在十分之一秒内得到响应,但由于某种原因,p.StandardOutput.ReadToEnd()行的暂停时间从1到5分钟不等!!

现在的实际问题是:

有人知道为什么会这么慢吗?或者可能是如何修复它并使其快速可接受?

更新:更多数据

如果我使用一个shell窗口,而实际上并没有捕获输出,我可以在shell窗口中观看任务的运行。它运行得稍微(非常稍微)快一点,但仍然处于静止状态,需要一分钟时间才能在shell窗口中显示输出。不知道它在做什么。

进程输出捕获非常缓慢

StreamReader.ReadToEnd将阻塞,直到读取所有数据。尝试使用Process.OutputDataReceived事件。

Process p = new Process();
p.StartInfo = psi;
p.OutputDataReceived += OutputHandler;
p.Start();
p.BeginOutputReadLine();
p.WaitForExit();
p.OutputDataReceived -= OutputHandler;
private void OutputHandler(object sender, DataReceivedEventArgs outLine)
{
    txtOutput.Text += outLine.Data;
}

我知道这个线程真的很旧,但我刚刚遇到了同样的问题,并且刚刚找到了一个解决方案:在x64计算机上使用x64任务列表。像现在这样使用x86.exe(在SysWow64中)将导致非常长的执行时间——它不会挂起,只是处理速度非常慢。你应该使用这个文件:

C:'Windows'sysnative'tasklist.exe