c# - 线程和 sleep ()

标签 c# multithreading cpu-usage

对于我正在开发的游戏,我想将音频放在另一个线程上,这样我就可以对声音进行排队并让它们立即播放。我在该线程中使用的代码如下所示

private void _checkForThingsToPlay()
{
    while (true)
    {
        if (_song != null)
        {
            _playSong(_song);
            _song = null;
        }

        while (_effects.Count > 0)
            _playSfx(_effects.Dequeue());

        Thread.Sleep(100);
    }
}

这是异步运行的,并且运行良好。但是,如果不调用 sleep ,它会占用 CPU 上的整个核心。我的问题是,sleep() 是降低 CPU 使用率的有效方法还是有更好的方法来做到这一点?我和我的 friend 觉得这是一个快速的技巧。

最佳答案

while(true) 循环中使用 Thread.Sleep() 通常是个坏习惯。看起来您有一个要在其上推送声音效果的队列,并且您希望“音频线程”在将这些效果插入队列后立即播放这些效果。这听起来像 producer/consumer queue .有多种方法可以在 C# 中构建这样的队列。您可以使用 Monitor.Wait()Monitor.Pulse() 或者您可以使用 AutoResetEvent 对象。

在 .NET 4 中,您还可以使用 BlockingCollection

对了,threading in C#网上有很好的介绍描述了许多常见的线程/同步场景和最佳实践。

关于c# - 线程和 sleep (),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10973794/

相关文章:

c# - 如何从 ViewModel (WPF) 引用 UI 元素?

c# - 使用 lib 文件夹安装 .net Windows 服务

c# - 在构造函数中初始化类的数组

c# - 使用 SQLite 和 C# 强制执行外键约束

c++ - 从多线程应用程序中高效退出(细节)

c# 检查线程/后台任务是否已完成或需要中止

objective-c - 结束在辅助线程中运行的 while 循环?

java - 限制java应用程序的内存和cpu使用

c - 多线程与使用大量 CPU 的多处理

linux - 高 CPU 使用率 - Linux 上的简单数据包接收器