如果从任务启动播放,则不会调用MediaPlayer“mediaEnded”

时间:2014-01-20 10:32:32

标签: c#

继续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事件......怎么回事?

0 个答案:

没有答案