继续previous related thread,我想稍微重构一下我的问题。如果从Task调用它,我仍然无法接收MediaPlayer类的mediaEnded事件,如下所述。更深入的是,我有一个名为音频的类库,这是一种构建块(我真的不喜欢那里的任务,只是简单的方法来做功能)
public class Audio
{
private MediaPlayer mediaPlayer = null;
public delegate void AudioDelegate();
public event AudioDelegate playbackEnded;
public void PlayAudioFileInMediaPlayer(string pathToWavFile)
{
mediaPlayer = new MediaPlayer();
mediaPlayer.MediaEnded += m_MediaEnded;
mediaPlayer.Open(new Uri(pathToWavFile));
mediaPlayer.Play();
}
void m_MediaEnded(object sender, EventArgs e)
{
MediaPlayer mediaPlayer = (MediaPlayer)sender;
mediaPlayer.Close();
playbackEnded.Invoke();
}
}
最重要的是,我有一个简单的业务逻辑层 BLL ,它调用该音频类方法。 BLL方法必须返回一个Task(它是从这里未提及的抽象BASE类派生的,用于简化,并且因为Audio类中的一些其他方法可能是CPU密集型的。
public class BLL
{
TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
public Task PlayAudio(string file)
{
Audio a = new Audio();
a.playbackEnded += a_playbackEnded;
Task.Factory.StartNew(() =>
{
a.PlayAudioFileInMediaPlayer(file);
});
return tcs.Task;
}
void a_playbackEnded()
{
tcs.TrySetResult(true);
}
}
在BLL之上,我们有 GUI 调用BLL。
public partial class Form1 : Form
{
BLL bll = new BLL();
public Form1()
{
InitializeComponent();
}
private async void button1_Click(object sender, EventArgs e)
{
await bll.PlayAudio(@"c:\files\1.wav");
}
}
仍然,没有调用Audio类上的mediaEnded事件......怎么回事?