WPF - 在循环中更新UI时播放声音

时间:2014-06-16 14:32:47

标签: c# wpf multithreading audio data-binding

我是WPF的新手,我终于设法创建了一个更新UI的for循环。但我搜索了很多网站,并没有找到解决问题的方法:

在我的MainWindow中,我有一个标签

<Label x:Name="labelName" Content="{Binding LabelNameContent}"/>

并在属性的代码隐藏

public string LabelNameContent
{
    get { return labelNameContent; }
    set
    {
        labelNameContent = value;
        RaisePropertyChanged("LabelNameContent");
    }
}

标签的文本在循环中更新,并且在循环期间应播放声音

Task.Factory.StartNew(() => 
{
    sound.Play();

    for(int i=0; i< 150; i++)
    {
        LabelNameContent = i.ToString();
        Thread.Sleep(500);
    }
});

我的问题是,声音被打断并且一直磕磕绊绊。

如何更新用户界面并播放声音?

1 个答案:

答案 0 :(得分:1)

你用什么课来播放声音?根据课程的不同,可能会有一个事件,您可以注册处理程序,以便在声音播放完毕时收到通知。因此,当您收到声音完成的通知时,您可以拨打sound.Play,等待AutoResetEvent,然后Set AutoResetEvent。最后,你的循环可以继续。像这样:

在表单的课程级别:

AutoResetEvent soundFinishedFlag = new AutoResetEvent(false);

然后,在你创建声音播放器的地方,你会这样做:

sound.Finished += SoundFinished;

请注意,上述行完全取决于您正在使用的声音播放器!这只是一个例子!

最后,您的匿名函数变为:

Task.Factory.StartNew(() => 
{
    sound.Play();

    // Wait for the sound to finish playing!
    AutoResetEvent.WaitOne();  // Note that this can take an optional time out so you can limit how long your program waits, if you want to.

    for(int i = 0; i < 150; i++)
    {
        LabelNameContent = i.ToString();
        Thread.Sleep(500);
    }
});

当然,如果你正在使用的声音播放器没有提供一个事件通知,上面写着&#34;我已经完成了#34;,这不会有帮助。

修改

根据您在评论中的回复,您需要让SoundPlayer在与UI和&amp;从更新标签内容的那个。

我的WPF应用使用SoundPlayer播放几种不同的声音之一。每个声音都有自己的专用SoundPlayer实例。当我播放声音时,会启动一个新的Thread&amp;在Play上调用Thread方法。这具有以下优点:

  1. 播放声音的线程除了播放声音外没有其他任何操作。
  2. 如果您需要在声音播放完毕之前停止播放,您只需停止线程运行SoundPlayer