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

标签 c# wpf multithreading audio data-binding

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

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

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

以及该属性(property)背后的代码
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);
    }
});

我的问题是,声音被打断并不断绊脚。

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

最佳答案

您正在使用什么类(class)播放声音?根据类的不同,可能会发生一个事件,您可以注册一个处理程序,以便在声音播放完毕时得到通知。因此,您可以调用sound.Play,等待AutoResetEvent,然后在收到声音结束通知时将Set编码为AutoResetEvent。最后,您的循环可以继续。像这样:

在您的表格的类(class)级别:

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);
    }
});

当然,如果您正在使用的声音播放器没有提供“我完成了”的事件通知,那么这将无济于事。

编辑

根据您对评论的回应,您需要让SoundPlayer在与UI分离的线程中以及从更新标签内容的线程中分离出来。

我的WPF应用使用SoundPlayer播放几种不同的声音之一。每个声音都有其专用的SoundPlayer实例。当我播放声音时,会启动一个新的Thread,并在该Play上调用Thread方法。这具有以下优点:
  • 播放声音的线程除了播放声音外没有做任何其他事情。
  • 如果您需要在声音播放完毕之前停止播放声音,只需停止运行SoundPlayer的线程即可。
  • 关于c# - WPF-在循环更新UI时播放声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24246089/

    相关文章:

    c# - StackOverflow 如何优化问题显示的性能?

    C# 调用以 char ** 指针作为参数的 C API

    c# - WPF 仅访问具有依赖属性的派生类的单个实例

    c# - 第一次索引数组太慢了

    android - 数组适配器在后台异常中修改

    java - 用户并发编辑对象的并发问题

    c# - 两因素谷歌身份验证与服务器上的代码不匹配 - ASP.Net MVC

    c# - Razor View 中的简写 If without else (ASP.NET MVC4)

    c# - WPF - TreeView 隐藏展开图标(箭头)

    ios - 从 Collection View 内部的url下载图像的性能哪种方法更好?