首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SoundPlayer导致内存泄漏?

SoundPlayer导致内存泄漏?
EN

Stack Overflow用户
提问于 2010-11-06 00:27:05
回答 8查看 3.5K关注 0票数 8

我正在用C#写一个基本的写作应用程序,我想让这个程序在你打字的时候发出打字机的声音。我已经将RichTextBox上的KeyPress事件挂接到一个函数上,该函数使用SoundPlayer在每次按键时播放一个简短的wav文件,但是我注意到,过了一段时间,我的计算机变慢了,检查我的进程,audiodlg.exe使用了5G的内存。

我使用的代码如下:

我将SoundPlayer初始化为程序开头的全局变量

代码语言:javascript
复制
SoundPlayer sp = new SoundPlayer("typewriter.wav")

然后,在KeyPress事件上,我只需调用

代码语言:javascript
复制
sp.Play();

有没有人知道是什么导致了大量的内存使用?这个文件的长度不到一秒,所以它应该不会阻塞太多东西。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-01-30 01:50:23

不要使用SoundPlayer -使用waveOut... API:

http://www.codeproject.com/Articles/4889/A-full-duplex-audio-player-in-C-using-the-waveIn-w

SoundPlayer更像是一个玩具,而不是一个可投入生产的组件,尽管我相信编写它的MS实习生的用意是好的。:)

更新:如果您使用链接的示例并熟悉代码,您将看到SoundPlayer实现可能存在的问题。使用waveOut...函数播放音频涉及两个内存中的缓冲区:一个较小的用于标题,而另一个可能比包含实际样本数据的缓冲区大。您链接到的修补程序文章提到,每次调用Play都会泄漏几百个字节,这意味着代码可能每次都实例化一个新的标头,然后没有正确地处理它。(假设SoundPlayer包装了waveOut...应用程序接口--我不知道是不是这样)

程序员理所当然地认为“不要重复发明轮子”这句格言。好吧,有时候轮子真的需要重新发明。

票数 6
EN

Stack Overflow用户

发布于 2010-11-06 00:48:26

这可能是SoundPlayer中的一个错误。

code project上试试这篇文章,也许它会给你一些提示。

票数 2
EN

Stack Overflow用户

发布于 2010-11-06 00:33:48

尝试使用声音播放器的Load方法加载声音,然后调用play。Play使用第二个线程加载(如果尚未加载)并播放文件。

也许构造器最初并没有加载文件(我认为这是很有可能的),它只是将播放器与声音文件名关联起来。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4107886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档