如何在与终端分离时为mono创建cpu友好的无限循环



我一直在我的自托管ServiceStack应用程序中使用这段代码来睡眠MainThread:

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

但当应用程序从终端分离时(例如,由启动-停止守护进程启动),它不起作用,因为这个错误:https://bugzilla.novell.com/show_bug.cgi?id=689976

作为一个快速的解决方法,我将代码更改为:

while (true)
{
    Thread.Sleep(100);
}

我看过那个线程。睡眠不应该这样使用。

当应用程序从终端分离并在mono上运行时,我如何正确地冻结主线程?

如果你在linux(或其他posix系统)上,而不是使用Console.ReadKey,你应该使用Mono.posix库来监听终止或终止信号,如ServiceStack wiki上的示例所示:

        UnixSignal [] signals = new UnixSignal[] { 
            new UnixSignal(Signum.SIGINT), 
            new UnixSignal(Signum.SIGTERM), 
        };
        // Wait for a unix signal
        for (bool exit = false; !exit; )
        {
            int id = UnixSignal.WaitAny(signals);
            if (id >= 0 && id < signals.Length)
            {
                if (signals[id].IsSet) exit = true;
            }
        }

相关内容

最新更新