Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 线程和睡眠()_C#_Multithreading_Cpu Usage - Fatal编程技术网

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。音频线程现在阻塞良好。