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