我怎么能在一个线程中使用SoundPlayer.PlaySync()而在另一个线程中使用Stop()呢?

时间:2015-03-16 06:17:58

标签: c# soundplayer

我正在写一个简单的.wav播放器。有两个按钮:播放按钮,停止按钮。

我有2个解决方案:

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();
                }
            });
        }
    }

0 个答案:

没有答案