2017-06-02 110 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

相關問題