0

我有一个小应用程序,目的是当用户按下一个键时会发生一些事情

  1. 创建用于记录击键的对象的新实例
  2. 检查字典,获取 System.Media.Soundplayer 类的实例
  3. 修改屏幕上某个部分的背景颜色
  4. 在 SoundPlayer 中异步播放 .wav 文件

Dictionary 和 SoundPlayer 实例在加载表单时被实例化,并且所有 SoundPlayer 实例在添加到字典之前同步 Load() .wav 文件。

表单的 KeyDown 事件如下所示:

//do stuff up here, get the type, etc etc
//players is Dictionary<EnumFoo, SoundPlayer>

SoundPlayer sound = players[type];
sound.Play();

this.KeyUp += (sUp, eUp) =>
{
    DateTime endTime = DateTime.Now;
    foo.Duration = endTime - startTime;
    sound.Stop();
    this.resetColors();
};

这是我的问题:它似乎只播放较短的声音。有些最长约 30 秒,而另一些则少于 5 秒。如果我在 SoundPlayer 实例化后的任何位置放置断点,那么即使是长声音也能正确播放。

我正在考虑使用 ThreadPool 并将项目排队,但该选项有其自己的一组后果。

有任何想法吗?我以前从来没有在任何媒体课上乱过。

4

1 回答 1

0

哎呀,刚刚意识到为什么会这样。一种三步回答

  1. 一个糟糕的假设是,当我按住键时,只有一个 KeyDown 事件被触发。这是不准确的。它会触发多次。
  2. 我被指出了错误的音频文件,其中有一段静音作为噪音的前奏。
  3. 漫长的一天和糟糕的测试。代码本身很好(至少,对于我需要它的一次性应用程序来说是可行的)只是我的测试很差。
于 2013-08-15T16:07:12.763 回答