我正在使用ThreadPool.QueueUserWorkItem播放一些声音文件,而没有挂起GUI。

它正在工作,但有不良的副作用。

在执行QueueUserWorkItem CallBack Proc时,没有什么可以阻止它启动新线程。这导致线程中的样本重叠。

如何使它等待已经运行的线程完成运行,然后才运行下一个请求?

编辑:private object sync = new Object();lock (sync) {.......do sound here}
这可行。按顺序播放声音。

但是当我继续播放声音请求之前,一些示例正在播放不止一次。会调查。

编辑:以上是Lock Convoy @Aaronaught提到的结果吗?

最佳答案

这是一个经典的线程同步问题,在该问题中,您有多个客户端都想使用相同的资源,并且需要控制它们的访问方式。在这种特殊情况下,声音系统愿意同时播放多个声音(这通常很理想),但是由于您不希望这种行为,因此可以使用标准锁定来控制对声音系统的访问:

public static class SequentialSoundPlayer
{
    private static Object _soundLock = new object();

    public static void PlaySound(Sound sound)
    {
        ThreadPool.QueueUserWorkItem(AsyncPlaySound, sound);
    }

    private static void AsyncPlaySound(Object state)
    {
        lock (_soundLock)
        {
            Sound sound = (Sound) state;
            //Execute your sound playing here...
        }
    }
}

“声音”是您用来表示要播放的声音的任何对象。当多个声音争夺播放时间时,此机制是“先到先得”。

如另一个答复中所述,请小心不要过多的声音堆积,因为您将开始阻塞ThreadPool。

关于c# - .NET ThreadPool QueueUserWorkItem同步,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2533966/

10-11 21:36