我一直在寻找这个论坛以及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();
}
}
答案 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;
}