Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从c#和mono启动进程时内存不足_C#_Linux_Process_Mono_Gpio - Fatal编程技术网

从c#和mono启动进程时内存不足

从c#和mono启动进程时内存不足,c#,linux,process,mono,gpio,C#,Linux,Process,Mono,Gpio,我正在使用安装了Debian的嵌入式linux板(Atmel AT91SAM)。有一个mono应用程序正在运行,它通过使用bash启动一个新的系统进程来调用cat,周期性地(比如每500毫秒)切换GPIO的输出。一段时间后,我得到一个“内存不足”异常,在几秒钟后“恢复自身”后,输出在一段时间内没有设置 这样设置pioC10是个坏主意吗?如果是这样的话,还有什么办法 我设置了文件的值 是否会发生此内存异常,因为 目前无法访问GPIO 是否有一种干净的方法来处理该进程,还是在方法自动关闭时完成 p

我正在使用安装了Debian的嵌入式linux板(Atmel AT91SAM)。有一个mono应用程序正在运行,它通过使用bash启动一个新的系统进程来调用cat,周期性地(比如每500毫秒)切换GPIO的输出。一段时间后,我得到一个“内存不足”异常,在几秒钟后“恢复自身”后,输出在一段时间内没有设置

  • 这样设置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);
        }
    }
    

您可以直接使用libc的
系统
尝试跳过进程类以及与之关联的任何内存管理/垃圾收集

在定义
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
调用是最直接的,并且在执行期间内存开销最小。。。