加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 06:29:17 所属栏目:百科 来源:网络整理
导读:这是一个简单明了的问题: 在Windows窗体中异步播放嵌入的.wav资源文件的正确方法是什么? 尝试#1: var player = new SoundPlayer();player.Stream = Resources.ResourceManager.GetStream("mySound");player.Play(); // Note that Play is asynchronous 好
这是一个简单明了的问题:

在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的what’s wrong with this code part 26.

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

解决方法

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

如果您要播放声音的要求“欺骗性简单”(您只需要在单个winform用户执行某些操作时播放偶尔的声音),那么我将使用上述的“尝试#4”.

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

如果您尝试每秒钟(或更快)将声音字节排列为10秒或100秒,那么其真正不是“简单的应用程序”和排队的线程/优先级子系统可能会排序.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读