为什么启动进程使我的c#控制台应用程序如此缓慢?



我有一个c#控制台应用程序,它首先初始化一些控制器->为ADB启动一个新进程,转发一个端口并使用它启动一个应用程序->然后打印出一个要求用户输入的菜单:

// Initialize some controllers here
// Create a new process for ADB
...
// --- Start an app with ADB:
var appProcess = new Process();
var appInfo = new ProcessStartInfo();
appInfo.FileName = ADB_PATH;
appInfo.Arguments = ... ; // arguments here
appInfo.RedirectStandardError = true;
appInfo.RedirectStandardOutput = true;
appProcess.StartInfo = appInfo;
appProcess.Start();
appProcess.OutputDataReceived += delegate (object sender, DataReceivedEventArgs e)
{
// Do something with output data
};
appProcess.ErrorDataReceived += delegate (object sender, DataReceivedEventArgs e)
{
// Do something with eror data
};
appProcess.BeginErrorReadLine();
appProcess.BeginOutputReadLine();
appProcess.Dispose();
// ----------------------------
while (keepAppRunning)
{
// Print menu
string userInput = Console.ReadLine()
}

那个Console.ReadLine()太慢了。当我在控制台上按下一些键时,这些键不会立即出现。打字有一些非常明显的延迟。我也不能按回车键。它也减慢了我的应用程序的其他部分。我得等上一分钟,一切才会恢复响应。

我试着把启动应用程序部分隔离,问题仍然存在,所以我确信问题在那里的某个地方。

您正在初始化appProcessappInfo,但随后启动serverProcess。这是你的本意,还是你想打电话给appProcess.Start()?

另外,您是否检查e.Data在回调中是否为空?这些可能是这里的瓶颈,但使用您提供的代码很难说。试着在你的"做点什么"语句中加入一个断点(或者至少是一个Debug.WriteLine(e.Data.ToString()))。查看它们被调用的频率。

顺便说一句,我建议把它放在try/catch/finally中(在finally块中调用appProcess.Dispose()),或者使用using(...)语句,以确保在出现异常时清理资源(参见下面修改后的代码版本)。

无论如何,Console.ReadLine不是罪魁祸首。这只是一些其他问题表现出来的地方(因为这是所提供代码中唯一面向用户的点)。

using var appProcess = new Process()
{
StartInfo = new ProcessStartInfo
{
FileName = "", // filename here
Arguments = "", // arguments here
RedirectStandardError = true,
RedirectStandardOutput = true
}
};
appProcess.OutputDataReceived += delegate (object sender, DataReceivedEventArgs e)
{
if (e.Data != null)
{
// Do something with output data, but only if it's not null
}
};
appProcess.ErrorDataReceived += delegate (object sender, DataReceivedEventArgs e)
{
if (e.Data != null)
{
// Do something with eror data, but only if it's not null
}
};
appProcess.Start();
appProcess.BeginErrorReadLine();
appProcess.BeginOutputReadLine();
while (keepAppRunning)
{
// Print menu
string userInput = Console.ReadLine()
}

相关内容

  • 没有找到相关文章

最新更新