【问题标题】:Mono console app as daemon take 100% cpuMono 控制台应用程序作为守护进程占用 100% cpu
【发布时间】:2015-11-27 14:28:30
【问题描述】:

我有一个控制台应用程序(我知道它应该是一个服务),最后有一个循环,所以它永远不会停止:

while (true)
{
    Console.ReadLine();
}

它使用单声道(raspbian wheezy)在 Raspberry Pi 上完美运行,但由于我使用 Raspbian Jessie 升级到 Pi 2,它在作为守护程序启动时使用 100% cpu。

似乎 Readline() 总是返回一个空行。任何的想法?为了测试目的,我的 init.d 脚本非常简单:

cd /myAppDir/
mono MyApp.exe &
exit 0

我尝试了 nohup,最后有/没有&,但没有成功

[编辑] 我不能使用 Thread.Sleep,因为我有一个定时器池化 UART。一个简单的解决方案是为所有工作创建另一个线程并在主线程中执行睡眠,但我想了解它为什么不能这样工作

【问题讨论】:

    标签: c# mono


    【解决方案1】:

    它在作为守护进程启动时使用 100% cpu。

    我不知道您是如何将进程作为守护进程启动的,但通常,守护进程会将 stdin 重定向到 /dev/null

    Null 设备立即产生 EOF,因此Console.ReadLine() 永远不会阻塞。

    我猜(我没有 Raspbian),运行守护进程的方式从 Raspbian Wheezy 变成了 Jessie。

    【讨论】:

    • 我就是这么想的,这就是为什么我很惊讶看到它在 Wheezy 上工作......谢谢!
    【解决方案2】:

    在完成 Main(string[] args) 之前你只需要这个

    private static void Main(string[] args)
    {
         //call method for daemon before while
         while (true)
         {
              Thread.Sleep(1000);
         }
    }
    

    这样,您的应用不会占用 100% 的 CPU 使用率

    【讨论】:

    • 这是一个老问题,但如果你完全阅读它,你会看到我说“我不能使用 Thread.Sleep 因为......”。我们所有的项目现在都使用 .net core
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 2012-03-10
    • 2012-07-26
    • 2012-01-23
    • 2012-12-16
    相关资源
    最近更新 更多