我知道其他用戶問這個問題,但我不知道如何解決我的問題。 下面是我的代碼(對不起,也許它太長)。 Visual Studio在線sounds[i].Stop();
上說「調用線程不能訪問這個對象,因爲不同的線程擁有它」。爲什麼?以及如何解決這個問題?
謝謝你這麼多!
C#:「調用線程不能訪問此對象,因爲不同的線程擁有它」?
private Thread th = null;
private void Form1_KeyDown(object sender, KeyPressEventArgs e)
{
foreach (PictureBox key in panel.Controls)
{
string name = key.Name;
string[] parts = name.Split('_');
if (e.KeyChar.ToString() == parts[1])
{
th = new Thread(press);
th.Start(new object[] { key, name });
}
}
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
foreach (PictureBox key in panel.Controls)
{
string name = key.Name;
string[] parts = name.Split('_');
if (Convert.ToChar(e.KeyValue).ToString().ToLower() == parts[1])
leave(key, name);
}
}
private void press(object data)
{
object[] array = (object[])data;
PictureBox pressedKey = (PictureBox)array[0];
string name = (string)array[1];
string[] parts = name.Split('_');
[...] Other code
play(parts[1].ToString());
}
private void leave(object sender, string name)
{
PictureBox pressedKey = sender as PictureBox;
string numero = pressedKey.Name;
string[] parts = numero.Split('_');
[...] Other code
stopPlay(parts[1].ToString());
}
List<System.Windows.Media.MediaPlayer> sounds = new List<System.Windows.Media.MediaPlayer>();
private void play(string note)
{
int i = 0;
string url;
bool diesis = false;
var sound = new System.Windows.Media.MediaPlayer();
while (!diesis && i < (nomi.Length))
{
if (note == nomi[i])
diesis = true;
i++;
};
if (diesis)
{
[...] Other code
}
else
{
url = Application.StartupPath + "\\suoniTastiBianchi\\" + note + ".wav";
sound = new System.Windows.Media.MediaPlayer();
sound.Open(new Uri(url));
sound.Play();
sounds.Add(sound);
}
}
private void stopPlay(string note)
{
for (int i = sounds.Count - 1; i >= 0; i--)
{
sounds[i].Stop();
sounds.RemoveAt(i);
}
}
@PhilippeParé我看到這個問題,閱讀答案,但我不知道如何解決我的問題。這就是爲什麼我寫了這個問題,有一個類似的問題,但我的代碼 – Marco
@Marco,注意MediaPlayer的是[DispatcherObject的(https://msdn.microsoft.com/en-us/library/system.windows.threading .dispatcherobject(v = vs.110)的.aspx)。因此使用MediaPlayer的調度程序來調用它的Stop()方法。 (更多詳細信息如何使用上面註釋中鏈接的Q + A中的DispatcherObject.Dispatcher屬性...) – elgonzo
@elgonzo抱歉,您能否爲我調用一段代碼來調用?因爲我不明白如何在我的代碼中使用它。 – Marco