C# 如何在一个线程中运行SoundPlayer.PlaySync()并在另一个线程中停止它?

C# 如何在一个线程中运行SoundPlayer.PlaySync()并在另一个线程中停止它?,c#,soundplayer,C#,Soundplayer,我正在写一个简单的.wav播放器。有两个按钮:播放按钮,停止按钮 我有两种解决方案: 1.使用Play()api播放.wav文件;使用Stop()api停止它。 问题是当一个.wav文件停止时(例如禁用播放按钮),我无法执行某些操作,因为Play()api在另一个线程中播放音频 2.自己创建一个线程,并在该线程中使用PlaySync()api,在音频停止后执行该任务。然后,当用户单击停止按钮时,调用stop()api来停止它。 但是,我发现Stop()api并没有真正停止音频 有人知道为什么吗

我正在写一个简单的.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();
                }
            });
        }
    }

你有没有找到解决办法?