2016-08-17 131 views
0

我正在創建一個應用程序,該應用程序有一個充滿自定義對象的多維數組,並且當按下按鈕時,需要播放特定於每個對象的聲音。MediaPlayer的線程問題C#

我運行此方法加載的聲音,運行沒有已知問題:

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."}

運行mediaplayer對象的對象嵌套在另一個對象中,是否是問題所在。我嘗試瞭解線程,但沒有取得任何進展。

我還需要,在某些情況下,需要讓所有聲音能夠一次播放。這是這份工作的最佳對象嗎?

+0

哪裏setSoundToPlay被調用?基本上你試圖從UI線程調用audio.Play,但音頻是由另一個線程擁有的 – SpaceghostAli

回答

0

訪問設備這樣的其他方法使用

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

使用與媒體播放器元素相關聯的調度屬性,這樣

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