![快速执行命令而不会耗尽内存](https://linux22.com/image/1054335/%E5%BF%AB%E9%80%9F%E6%89%A7%E8%A1%8C%E5%91%BD%E4%BB%A4%E8%80%8C%E4%B8%8D%E4%BC%9A%E8%80%97%E5%B0%BD%E5%86%85%E5%AD%98.png)
我正在编写一个在 Mono 上运行的 .Net 应用程序。它每秒左右连续执行并获取几个终端命令的输出。
然而,几秒钟后它就会崩溃,因为输出为空。
经过进一步检查,这是由于进程因内存不足而崩溃造成的,例如:
ERROR: System.ComponentModel.Win32Exception: ApplicationName='upower', CommandLine='-i /org/freedesktop/UPower/devices/battery_BAT0', CurrentDirectory='', Native error= Out of memory
有没有办法可以快速执行命令,同时清理使用后的内存,以免内存耗尽?
我正在执行如下命令:
Dim ret As String = ""
Dim proc As New System.Diagnostics.Process()
proc.StartInfo.FileName = file 'i.e upower
proc.StartInfo.Arguments = arguments 'i.e. -i /org/freedesktop/UPower/devices/battery_BAT0
proc.StartInfo.UseShellExecute = False
proc.StartInfo.RedirectStandardOutput = True
proc.Start()
ret = proc.StandardOutput.ReadToEnd()
proc.WaitForExit()
Return ret
如果有帮助,运行“Mono --version”将返回版本 3.2.8。
我甚至尝试proc.WaitForExit()
在读取输出之前进行放置,但这没有帮助。
答案1
前:proc.Start()
添加处理程序方法。例如:
process.OutputDataReceived += (sender, a) => Console.WriteLine(a.Data);
并将此行替换为:
ret = proc.StandardOutput.ReadToEnd()
有了这个:
process.BeginOutputReadLine();
另外,您也可以尝试在原始代码中添加 only process.BeginOutputReadLine()
after ret = proc.StandardOutput.ReadToEnd()
(因此只需在调用 BeginOutputReadLine 后添加一行)。这应该可以防止 StandardError 流出现死锁。
祝你好运!