C# 线程和睡眠()
对于我正在制作的一个游戏,我想把音频放到另一个线程上,这样我就可以把声音排成一列,让它们立即播放。我在该线程中使用的代码如下所示C# 线程和睡眠(),c#,multithreading,cpu-usage,C#,Multithreading,Cpu Usage,对于我正在制作的一个游戏,我想把音频放到另一个线程上,这样我就可以把声音排成一列,让它们立即播放。我在该线程中使用的代码如下所示 private void _checkForThingsToPlay() { while (true) { if (_song != null) { _playSong(_song); _song = null; } while (_eff
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使用率的有效方法还是有更好的方法?我和我的朋友觉得这是一个快速的破解。这就是所谓的,并且很容易解决。如果您使用的是.NET 4,请尝试BlockingCollection
。中有一个很好的示例代码
请注意示例代码中的这一行:
while (true) Console.WriteLine(bc.Take());
这实际上会阻塞(不会浪费CPU周期),直到有东西要消耗。在
while(true)
循环中使用Thread.Sleep()
通常是一个坏习惯。看起来您有一个队列,您想在其中推送声音效果,并且希望“音频线程”在将这些效果推送到队列上后立即播放这些效果。这听起来像是一个错误。在C#中有多种方法可以构建这样的队列。您可以使用Monitor.Wait()
和Monitor.Pulse()
或使用AutoResetEvent
对象
在.NET 4中,您还可以使用阻止集合
顺便说一句,有一个非常好的在线介绍,介绍了许多常见的线程/同步场景和最佳实践。如果你可以使用反应式框架(Rx),那么你会发现一大堆“调度器”用于异步操作排序。我将所有队列交换为BlockingCollections,并将我的循环设置为与您的类似(我刚刚将我的dequeue()更改为take())。但是,我的CPU使用率仍然很高,所以我假设它没有阻塞。除了调用Take(),还有其他事情吗?没关系,还有其他事情正在消耗CPU。音频线程现在阻塞良好。