【问题标题】:Threading issue with MediaPlayer C#MediaPlayer C# 的线程问题
【发布时间】:2016-12-24 08:45:25
【问题描述】:

我正在创建一个应用程序,它有一个充满自定义对象的9x9 多维数组,当按下按钮时,需要播放每个对象特定的声音。

我运行这个方法来加载声音,运行没有已知问题:

   public void setSoundToPlay()
    {
        OpenFileDialog openFileDiag = new OpenFileDialog();
        if ((bool)openFileDiag.ShowDialog())
        {
            audio = new MediaPlayer();
            audio.Open(new System.Uri(openFileDiag.FileName));
        }

    }

但是当我激活另一种播放声音的方法时:

    public void buttonActivated()
    {
                audio.Play();
    }

我收到了System.InvalidOperationException:{"The calling thread cannot access this object because a different thread owns it."}

运行媒体播放器对象的对象嵌套在另一个对象中,这就是问题所在。我尝试理解线程,但没有取得进展。

在某些情况下,我还需要让所有声音都能同时播放。这是最适合这项工作的对象吗?

【问题讨论】:

  • setSoundToPlay 在哪里被调用?基本上你正在尝试从 UI 线程调用 audio.Play 但音频由另一个线程拥有

标签: c# wpf multithreading error-handling


【解决方案1】:

使用与媒体播放器元素关联的 Dispatcher 属性,像这样

 public void buttonActivated()
 { 
   audio.Dispatcher.Invoke(() =>
            {
                audio.Play();
            });
 }

【讨论】:

    【解决方案2】:

    要通过其他方法访问这样的设备,请使用

    Application.Current.Dispatcher.BeginInvoke(new Action(() => objectName);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-08
      • 2011-09-30
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多