从c#和mono启动进程时内存不足
我正在使用安装了Debian的嵌入式linux板(Atmel AT91SAM)。有一个mono应用程序正在运行,它通过使用bash启动一个新的系统进程来调用cat,周期性地(比如每500毫秒)切换GPIO的输出。一段时间后,我得到一个“内存不足”异常,在几秒钟后“恢复自身”后,输出在一段时间内没有设置从c#和mono启动进程时内存不足,c#,linux,process,mono,gpio,C#,Linux,Process,Mono,Gpio,我正在使用安装了Debian的嵌入式linux板(Atmel AT91SAM)。有一个mono应用程序正在运行,它通过使用bash启动一个新的系统进程来调用cat,周期性地(比如每500毫秒)切换GPIO的输出。一段时间后,我得到一个“内存不足”异常,在几秒钟后“恢复自身”后,输出在一段时间内没有设置 这样设置pioC10是个坏主意吗?如果是这样的话,还有什么办法 我设置了文件的值 是否会发生此内存异常,因为 目前无法访问GPIO 是否有一种干净的方法来处理该进程,还是在方法自动关闭时完成 p
- 这样设置pioC10是个坏主意吗?如果是这样的话,还有什么办法 我设置了文件的值李>
- 是否会发生此内存异常,因为 目前无法访问GPIO
- 是否有一种干净的方法来处理该进程,还是在方法自动关闭时完成
private void OnTimer1Event(object source, ElapsedEventArgs e) { alternateBlinkTimer1.Stop(); alternateBlinkTimer2.Start(); try { var processStartInfo = new ProcessStartInfo { FileName = "/bin/bash", Arguments = "-c \"echo 1 > /sys/class/gpio/pioC10/value\"" }; System.Diagnostics.Process process = new Process(); process.StartInfo = processStartInfo; process.Start(); } catch (Exception err) { log.Error(err.Message); } }
系统
尝试跳过进程类以及与之关联的任何内存管理/垃圾收集
在定义OnTimer1Event
方法的类中,将定义添加到system
:
[DllImport ("libc")]
private static extern int system (string exec);
然后你可以:
private void OnTimer1Event(object source, ElapsedEventArgs e)
{
alternateBlinkTimer1.Stop();
alternateBlinkTimer2.Start();
system("echo 1 > /sys/class/gpio/pioC10/value\");
}
谢谢!你能告诉我,垃圾收集和内存使用有什么不同吗?我现在就去试试!在像您这样的内存高度有限的环境中,每当您
new
一个类并且该对象超出范围时,GC都可以回收内存,但只有在满足某些阈值时才会这样做。在受限内存和cpu环境中。您应该考虑使用对象池,而不是在每个方法调用上创建新对象。也就是说,在原始代码中,您可以将ProcessStartInfo
和Process
的对象创建移动到类的私有成员,只需调用Process即可。每次调用计时器事件时启动。。。因此,不需要创建新对象,只需重新使用现有对象即可。非常好的阅读:Mono中的SGen GC:感谢您的帮助!我现在应该使用System.Diagnostics.Process还是外部dll libc中的系统?我已经尝试过你的解决方案,效果很好。我仍然需要对它进行长期测试,我将在这里向您报告结果。很高兴它成功了,希望您的长期测试能够顺利进行。。至于哪种方法,这实际上取决于您,system
调用是最直接的,并且在执行期间内存开销最小。。。