4

我目前正在运行以下代码,以测试外部应用程序是否实际上正在使用我的 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 窗口中之前仍然需要等待一分钟。不知道它在做什么。

4

2 回答 2

2

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;
}
于 2013-09-03T17:24:34.287 回答
1

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

C:\Windows\sysnative\tasklist.exe
于 2016-08-04T17:05:42.827 回答