我目前正在运行以下代码,以测试外部应用程序是否实际上正在使用我的一个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");
现在,这段代码工作!!! ....但它的STUPID很慢。我可以在cmd窗口中键入相同的命令,并在十分之一秒内得到响应,但由于某种原因,该行p.StandardOutput.ReadToEnd()
上的暂停时间为1到5分钟!
现在问题是:
有谁知道为什么会这么慢?或者可能如何解决它并使其快速可接受?
更新:更多数据
如果我使用shell窗口并且实际上没有捕获输出,我可以在shell窗口中观察任务运行。它的运行速度很快(非常小),但在输出开始出现在shell窗口之前仍然需要一分钟。不知道它在做什么。
答案 0 :(得分:1)
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;
}
答案 1 :(得分:1)
我知道这个帖子真的很老了,但是我遇到了同样的问题并且发现了一个修复:在x64计算机上使用x64任务列表。像你在这里使用x86 .exe(在SysWow64中)将导致一个非常长的执行时间 - 它不会挂起,它只是非常缓慢地处理它。你应该使用这个文件:
C:\Windows\sysnative\tasklist.exe