我一直在自托管的ServiceStack应用程序中使用以下代码来使MainThread休眠:

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

但是由于以下错误,当应用程序从终端分离时(例如,由start-stop-daemon启动),它不起作用。

作为一种快速的解决方法,我已将代码更改为:
while (true)
{
    Thread.Sleep(100);
}

我已经看到Thread.Sleep不应该以这种方式使用。

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

最佳答案

如果您使用的是Linux(或其他 posix 系统),则应使用Mono.Posix库而不是 Console.ReadKey 来监听终止或终止信号,如ServiceStack Wiki上的example所示:

        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;
            }
        }

09-11 23:22