线程和睡眠()

本文关键字:线程 | 更新日期: 2023-09-27 18:36:40

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

private void _checkForThingsToPlay()
{
    while (true)
    {
        if (_song != null)
        {
            _playSong(_song);
            _song = null;
        }
        while (_effects.Count > 0)
            _playSfx(_effects.Dequeue());
        Thread.Sleep(100);
    }
}

这是异步运行的,并且工作得很好。 但是,如果没有睡眠调用,它会占用 CPU 上的整个内核。 我的问题是,sleep() 是降低 CPU 使用率的有效方法,还是有更好的方法来做到这一点? 我和我的朋友觉得这是一个快速的黑客。

线程和睡眠()

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

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

顺便说一下,在 C# 中有一个非常好的线程处理在线介绍,其中描述了许多常见的线程/同步方案和最佳实践。

这被称为生产者-消费者问题,可以很容易地解决。如果您使用的是 .NET 4,请尝试BlockingCollection 。MSDN 页中有一个很好的示例代码。

请注意示例代码中的此行:

while (true) Console.WriteLine(bc.Take());

这实际上会阻塞(没有浪费 CPU 周期),直到有东西要消耗