2016-08-17 6 views
0

Ich erstelle eine App mit einem 9x9 multidimensionalen Array voller benutzerdefinierter Objekte, und wenn eine Taste gedrückt wird, muss ein Sound für jedes einzelne Objekt abgespielt werden.Threading-Problem mit MediaPlayer C#

ich diese Methode führen Sie den Sound zu laden, läuft ohne bekannte Probleme:

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

    } 

aber wenn ich aktivieren andere Methode Ton zu spielen:

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

ich System.InvalidOperationException:{"The calling thread cannot access this object because a different thread owns it."}

erhalten

Das Objekt, auf dem das Mediaplayer-Objekt ausgeführt wird, ist in einem anderen Objekt verschachtelt, ist das das Problem? Ich habe versucht, Threading zu verstehen, habe aber keine Fortschritte gemacht.

Ich muss auch in einigen Fällen müssen alle Sounds auf einmal spielen können. Ist das das beste Objekt für den Job?

+0

Wo setSoundToPlay aufgerufen? Im Grunde versuchen Sie, audio.Play vom UI-Thread zu starten, aber Audio gehört einem anderen Thread – SpaceghostAli

Antwort

0

Für den Zugriff auf Geräte wie dies von anderen Methoden verwenden

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

der Dispatcher-Eigenschaft mit dem Media-Player Element zugeordnet verwenden, wie dieser

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