当前位置:  开发笔记 > 编程语言 > 正文

如何使用System.Media.SoundPlayer异步播放声音文件?

如何解决《如何使用System.Media.SoundPlayer异步播放声音文件?》经验,为你挑选了1个好方法。

这是一个看似简单的问题:

在Windows窗体中异步播放嵌入式.wav资源文件的正确方法是什么?

尝试#1:

var player = new SoundPlayer();
player.Stream = Resources.ResourceManager.GetStream("mySound");
player.Play(); // Note that Play is asynchronous

好:不阻止UI线程

错误:SoundPlayer和嵌入的资源流不会立即处理.

尝试#2:

using (var audioMemory = Resources.ResourceManager.GetStream("mySound"))
{
    using (var player = new SoundPlayer(audioMemory))
    {
        player.Play();
    }
}

好:未阻止UI线程,立即处理SoundPlayer和音频内存流.

坏:竞争条件!Play()是异步的,如果音频内存在播放完成之前被释放...繁荣!抛出运行时异常.

尝试#3:

using (var audioMemory = Resources.ResourceManager.GetStream("mySound"))
{
    using (var player = new SoundPlayer(audioMemory))
    {
        player.PlaySync();
    }
}

好:播放器和音频流立即处理.

错误:PlaySync会阻止UI线程

尝试#4:

ThreadPool.QueueUserWorkItem(ignoredState =>
  {
    using (var audioMemory = Resources.ResourceManager.GetStream("mySound"))
    {
        using (var player = new SoundPlayer(audioMemory))
        {
            player.PlaySync();
        }
    }
  });

好:UI不会冻结,播放器和内存流会立即处理掉.

坏:因为这经常发生,我们可能会用尽线程池线程!请参阅Larry Osterman 这段代码26的错误.

看起来SoundPlayer应该有一个PlayAsyncCompleted事件.不幸的是,不存在此类事件.我错过了什么吗?在Windows窗体中异步播放.wav嵌入式资源的正确方法是什么?



1> BlueShepherd..:

我没有足够的声誉来评论,所以我只是回答.

如果您播放声音的要求"看似简单"(您只想在单个winform用户执行某些操作时偶尔播放声音),那么我将使用上面的尝试#4.

拉里·奥斯特曼(Larry Osterman)的"这个代码部分26有什么问题"让他的"系统"在每次按键时都会关闭一个新的线程池线程(播放声音).他指出,在敲打它的过程中,在大约15秒内打破了默认的500线程池大小,但这也是使用异步RPC同时使用线程池的客户端/服务器应用程序.真的不是一个"看似简单"的应用程序.

如果您尝试每秒(或更快)将声音字节排队10秒或100秒,那么它实际上不是"简单应用程序",排队的线程/优先级子系统可能是有序的.

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有