c# - 从终端分离时如何为单声道制作 cpu 友好的无限循环

标签 c# multithreading mono servicestack

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

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

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

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

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

我已经看到 Thread.Sleep 不应该这样使用。

当应用程序从终端分离并在单声道上运行时,我如何正确地卡住主线程?

最佳答案

如果您使用的是 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;
            }
        }

关于c# - 从终端分离时如何为单声道制作 cpu 友好的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34113160/

相关文章:

c# - 如果另一条消息即将说出,如何停止 SpeakAsync?

python - 关于 python 中多线程方法的体系结构问题

c - 在 c 和 mono 之间传递(函数)指针

java - JBullet NullPointer 在单独线程中进行步骤模拟

java - 嵌套 future 不执行

c# - GTK# 和 Windows 窗体之间有什么区别?

android - 安装适用于 Android 的 Xamarin Mono

c# - 如何从实时流中播放音频

c# - .net MVC 使用数据库的简单成员身份验证

c# - 返回用内存流初始化的 SqlXml