2013-08-14 2 views
0

У меня есть небольшое приложение, цель в том, что, когда пользователь нажимает клавишу несколько вещей, которые случаютсяSystem.Media.SoundPlayer Selective Игра

  1. Создает новый экземпляр объекта для записи нажатий клавиш
  2. Проверяет словарь, хватает экземпляр System.Media.Soundplayer класса
  3. Изменяет BackColor секции на экране
  4. Пьеса, асинхронный, файл .wav в SoundPlayer

экземпляры Dictionary и SoundPlayer создаются при загрузке формы, и все экземпляры SoundPlayer синхронно загружают файлы .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 и очередности элементов, но этот параметр имеет свой собственный набор ветвей.

Любые идеи? Мне никогда не приходилось вмешиваться в какие-либо из медиа-классов.

ответ

0

Ой, просто понял, почему это происходит. Вид ответа 3-го шага

  1. Плохое предположение о том, что, когда я держал ключ, только одно событие KeyDown запускалось. Это неверно. Он будет срабатывать несколько раз.
  2. Я указал на неправильные аудиофайлы, в которых был раздел молчания, чтобы предиповать шум.
  3. Длинный день и плохое тестирование. Сам код в порядке (по крайней мере, для явного приложения, для которого он нужен) это было просто плохое тестирование с моей стороны.