C# 如何在一个线程中运行SoundPlayer.PlaySync()并在另一个线程中停止它?
我正在写一个简单的.wav播放器。有两个按钮:播放按钮,停止按钮 我有两种解决方案: 1.使用Play()api播放.wav文件;使用Stop()api停止它。 问题是当一个.wav文件停止时(例如禁用播放按钮),我无法执行某些操作,因为Play()api在另一个线程中播放音频 2.自己创建一个线程,并在该线程中使用PlaySync()api,在音频停止后执行该任务。然后,当用户单击停止按钮时,调用stop()api来停止它。 但是,我发现Stop()api并没有真正停止音频 有人知道为什么吗C# 如何在一个线程中运行SoundPlayer.PlaySync()并在另一个线程中停止它?,c#,soundplayer,C#,Soundplayer,我正在写一个简单的.wav播放器。有两个按钮:播放按钮,停止按钮 我有两种解决方案: 1.使用Play()api播放.wav文件;使用Stop()api停止它。 问题是当一个.wav文件停止时(例如禁用播放按钮),我无法执行某些操作,因为Play()api在另一个线程中播放音频 2.自己创建一个线程,并在该线程中使用PlaySync()api,在音频停止后执行该任务。然后,当用户单击停止按钮时,调用stop()api来停止它。 但是,我发现Stop()api并没有真正停止音频 有人知道为什么吗
private SoundPlayer player;
//...
private async void PlayButton_Click(object sender, RoutedEventArgs e)
{
dynamic call = employeeDataGrid.SelectedItem;
if (call == null)
{
await this.ShowMessageDialogAsync("错误", "请选择通话");
return;
}
playButton.IsEnabled = false;
playButton.Visibility = Visibility.Collapsed;
stopButton.Visibility = Visibility.Visible;
player = new SoundPlayer(call.recording);
Utility.PlayTone(player, new Action(() =>
{
Dispatcher.Invoke(() =>
{
stopButton.IsEnabled = false;
stopButton.Visibility = Visibility.Collapsed;
playButton.IsEnabled = true;
playButton.Visibility = Visibility.Visible;
});
}));
}
private void StopButton_Click(object sender, RoutedEventArgs e)
{
if (player != null)
player.Stop();
}
public static class Utility
{
public static void PlayTone(SoundPlayer player, Action callback)
{
Task.Factory.StartNew(() =>
{
player.PlaySync();
if (callback != null)
{
callback();
}
});
}
}
你有没有找到解决办法?