Я работаю над приложением, которое записывает ввод с микрофонов в файлы .wav, используя NAudio. Мой класс Recorder использует BackgroundWorker для записи. Я начинаю запись и продолжаю делать это до тех пор, пока не истечет 10 секунд или пользователь не запросит отмену. Это работает нормально в большинстве случаев, кроме одного. При отладке, когда я отсоединяю записывающее устройство на полпути, все идет в никуда. Я ожидал, что проблема будет обнаружена в методе BackgroundWorkedCompletedTask в случае, когда аргументом события завершения работника является e.Error (что прекрасно работает, если я выбрасываю любое стандартное исключение), но это не так. Когда я выбираю «Разбить все», он приводит меня к методу BackgroundWorkedCompletedTask в строке this.waveIn.StopRecording();
, и все свойства объекта отображаются как Невозможно оценить выражение, поскольку собственный кадр находится поверх стека вызовов.
Я предполагаю, что это связано с NAudio, использующим неуправляемый код для взаимодействия с устройством; Я был бы признателен за любые рекомендации или предложения о том, как следует иметь дело с такими ситуациями. Не похоже, чтобы блок try / catch справился с этой задачей, так где мне с этим бороться? Заранее благодарю за любую помощь.
Для полноты вот две соответствующие части кода:
private void RecordUsingBackgroundWorker(BackgroundWorker worker)
{
var devices = this.FindDevices();
var deviceIndex = devices.IndexOf(this.requestedDevice);
var waveIn = new WaveIn(WaveCallbackInfo.FunctionCallback());
waveIn.DeviceNumber = deviceIndex;
waveIn.WaveFormat = new WaveFormat(8000, 1);
this.waveIn = waveIn;
this.waveIn.DataAvailable += new EventHandler<WaveInEventArgs>(DataIsAvailable);
var filename = Globals.ThisAddIn.CommentFilePath;
this.waveFileWriter = new WaveFileWriter(filename, waveIn.WaveFormat);
var stopwatch = new Stopwatch();
stopwatch.Start();
this.waveIn.StartRecording();
while (stopwatch.ElapsedMilliseconds < 10000 && !worker.CancellationPending)
{
}
}
Вот код, который выполняется после завершения работы:
private void BackgroundWorkedCompletedTask(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
}
else if (e.Error != null)
{
}
if (this.waveIn != null)
{
this.waveIn.StopRecording();
}
this.CleanUpAfterStoppedRecording();
this.IsRecording = false;
if (this.RecorderBusyRecordingChanged != null)
{
this.RecorderBusyRecordingChanged(this, new RecorderBusyEventArgs(false));
}
}