如何同步异步操作?

时间:2014-01-16 21:38:20

标签: c# winforms media-player

我一直在寻找这个论坛以及MSDN,但我找不到适合我的问题的解决方案。可能我的做法并不好。 我有以下简单的类,它有一个简单的方法(“PlayAudioFile”)。我想做的就是等待播放完成后再让方法结束并继续前进。由于.Play()是异步的,因此方法在播放完成之前完成,这对我不利,因为我想同步播放多个文件(1个接一个)。我已经尝试使用AutoResetEvent没有运气,因为当播放结束时,我没有进入“MediaEnded”回调.... 1我不想使用的解决方案是让while()循环忙等待提升的标志MediaEnded内部表示播放已完成。它似乎不对。

有什么想法吗?

public class Audio
{
    AutoResetEvent are = new AutoResetEvent(false);
    public void PlayAudioFile(string file)
    {
        MediaPlayer mediaPlayer = new MediaPlayer();
        mediaPlayer.MediaEnded += m_MediaEnded;
        mediaPlayer.Open(new Uri(file));
        mediaPlayer.Play();
        are.WaitOne();

    }

    private void m_MediaEnded(object sender, EventArgs e)
    {
        MediaPlayer mediaPlayer = (MediaPlayer)sender;
        mediaPlayer.Close();
        mediaPlayer = null;
        are.Set();
    }

}

1 个答案:

答案 0 :(得分:2)

如果您使用.Net framework> = 4.5,则可以使用async / await。你的代码可能是这样的(对不起,我盲目地编码)

await PlayAudioFile(somefile);

public Task PlayAudioFile(string file)
{
    var tcs = new TaskCompletionSource<bool>();
    MediaPlayer mediaPlayer = new MediaPlayer();
    mediaPlayer.MediaEnded += (sender, e) =>
        {
            mediaPlayer.Close();
            tcs.TrySetResult(true);
        };
    mediaPlayer.Open(new Uri(file));
    mediaPlayer.Play();
    return tcs.Task;
}