首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何同步异步操作?

如何同步异步操作?
EN

Stack Overflow用户
提问于 2014-01-16 21:38:20
回答 1查看 514关注 0票数 1

我一直在这个论坛,以及在MSDN,但我没有找到一个适当的解决方案,我的问题。可能我的方法不好。我有下面这个简单类,它有一个简单的方法("PlayAudioFile")。我所要做的就是等待回放完成,然后让方法完成并继续前进。由于.Play()是异步的,方法在回放完成之前就完成了--这对我不好,因为我想同步播放几个文件(一个接着另一个)。我尝试使用AutoResetEvent w/o运气,因为当播放结束时,我不会进入"MediaEnded“回调.1我不想使用的解决方案是让while ()循环忙着等待在MediaEnded内部发出回放信号的标志。只是看上去不太对。

有什么想法吗?

代码语言:javascript
复制
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();
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-16 21:50:43

如果您使用的是.Net framework>= 4.5,则可以利用异步/等待。您的代码可以是这样的(对不起,我盲目地编写代码)

代码语言:javascript
复制
await PlayAudioFile(somefile);

代码语言:javascript
复制
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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21173429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档