2017-06-02 97 views
-1

我知道其他用户问这个问题,但我不知道如何解决我的问题。 下面是我的代码(对不起,也许它太长)。 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); 
    } 
} 
+0

@PhilippeParé我看到这个问题,阅读答案,但我不知道如何解决我的问题。这就是为什么我写了这个问题,有一个类似的问题,但我的代码 – Marco

+0

@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

+0

@elgonzo抱歉,您能否为我调用一段代码来调用?因为我不明白如何在我的代码中使用它。 – Marco

回答

0

不要调用press方法或任何需要访问单独线程上的用户控件的方法。你可以在同一个线程上调用这些方法。如果您不想通过在UI线程上执行所有代码来阻止UI线程,则将您的代码划分为两个区域:

1)需要更新用户控件 2)不需要更新用户控件

位于第二个区域的代码可以在单独的线程上执行。

您可以通过谷歌的“线程关联”了解更多关于这种情况的信息。

+0

骗你请写一段代码给我?只要知道如何用我的代码做到这一点:) – Marco

相关问题