3

前几天我刚刚找到了 NAudio,我一直在玩它。我编写了一个简单的 Windows 窗体程序,它有一个加载按钮(加载特定的 .wav 歌曲)和播放、暂停、停止、淡入声音的按钮(我自己使用计时器和逐渐增加的音量添加的功能),以及淡出声音。我还有一个轨迹栏控件来处理音量。我创建了一个包装类来放入所有 NAudio 的东西,以及添加额外的功能,如声音开始或暂停时的淡入/淡出和事件通知。

好的,都说,这工作正常。程序正确加载、播放、暂停、停止和淡入淡出。音量轨迹栏正确反映了正在播放的歌曲的音量。这很有效,但我确实有两个问题。

首先,在我单击“加载”按钮加载声音然后执行所有我想要(或不)的播放后,当我退出程序时,我收到以下弹出错误消息(“断言失败”):“AcmStreamHeader在 AcmStreamHeader.Finalize() 处未调用 dispose。这是“中止、重试、忽略”弹出窗口之一,但几秒钟后它消失并且项目终止。(注意:加载功能创建 DirectSoundOut 并调用 CreateInputStream... 直接取自站点上的 NAudio 示例。它还为定义的事件设置事件处理程序,但这可能无关紧要。)

在类析构函数中,我进行了以下调用:

mainOutputStream.Close();
mainOutputStream.Dispose();
waveOutDevice.Dispose();

但我仍然得到错误。这是一个大问题,我将在另一个线程中问另一个问题。知道为什么会发生这种情况以及如何阻止它吗?

我在 Windows 7 32 位上运行 VS 10。

4

1 回答 1

4

错误的最可能原因(它实际上只是一个 Debug.Assert - 它不会出现在 NAudio 的发布版本中),是 mainOutputStream 被分配给多个 WaveStream 并且当您更改它时,您没有处理旧的一。当您退出应用程序时,垃圾收集器会运行并且此 Debug.Assert 会触发。

其他几点:

  • 无需调用 mainOutputStream.Close 和 Dispose。只需打电话给其中一个。
  • 您的清理代码不应在类析构函数(终结器?)中,而应在 Dispose 方法中,对于 Form,在 Closing 或 Closed 事件处理程序中。
  • 编辑:另一个可能的原因是您从 WaveStream 派生并且在您覆盖的 Dispose 方法中没有对作为类成员的任何 WaveStreams 调用 Dispose。
于 2011-06-15T19:22:51.547 回答