SoundPlayer导致内存泄漏?

Nic*_*ell 8 c# audio memory-leaks soundplayer

我正在用C#编写一个基本的写作应用程序,我希望程序能够在输入时输出打字机声音.我已经将我的RichTextBox上的KeyPress事件挂钩到一个函数,该函数使用SoundPlayer每次按下一个键时播放一个简短的wav文件,但是我注意到一段时间后我的计算机慢慢爬行并检查我的进程,audiodlg .exe正在使用5 GIGABYTES的RAM.

我正在使用的代码如下:

我将SoundPlayer初始化为程序启动时的全局变量

SoundPlayer sp = new SoundPlayer("typewriter.wav")
Run Code Online (Sandbox Code Playgroud)

然后在KeyPress事件上我只是打电话

sp.Play();
Run Code Online (Sandbox Code Playgroud)

有谁知道导致大量内存使用的原因是什么?该文件不到一秒钟,所以它不应该堵塞太多东西.

Mus*_*sis 6

不要使用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...API - 我不知道是否是这种情况)

程序员理所当然地认为"不要重新发明轮子".好吧,有时轮子迫切需要重新发明.