C# 交叉线程操作无效:控件';列表框1';从a>;线程,而不是创建它的线程

C# 交叉线程操作无效:控件';列表框1';从a>;线程,而不是创建它的线程,c#,xmpp,multithreading,C#,Xmpp,Multithreading,可能重复: 当我尝试将项目添加到列表框时,出现以下错误: 跨线程操作无效:从访问控件“listBox1” 线程,而不是创建它的线程 以下是您的代码: private void Form1_Load(object sender, EventArgs e) { Jid jd = new Jid("USERNAME"); xmpp.Open(jd.User, "PASSWORD"); xmpp.OnLogin += new ObjectHandler(xmpp_OnLogin

可能重复:

当我尝试将项目添加到列表框时,出现以下错误:

跨线程操作无效:从访问控件“listBox1” 线程,而不是创建它的线程

以下是您的代码:

private void Form1_Load(object sender, EventArgs e)
{
    Jid jd = new Jid("USERNAME");
    xmpp.Open(jd.User, "PASSWORD");
    xmpp.OnLogin += new ObjectHandler(xmpp_OnLogin);
    agsXMPP.XmppConnection p;
    xmpp.OnPresence += new PresenceHandler(xmpp_OnPresence);
}
void xmpp_OnPresence(object sender, Presence pres)
{
    listBox1.Items.Add(pres.From .User ); --- **HERE I AM GETTING ERROR.**
}

我对C#和线程有点陌生,我在谷歌上搜索并查看了很多文章,包括SO,但我仍然不知道如何解决这个问题。

除了ui线程,你不能在任何其他线程上触摸ui控件。当您收到错误时,OnPresence处理程序将在单独的线程上调用。您需要使用Invoke()或BeginInvoke()在ui线程上进行listbox.Items.Add调用,请参见示例

试试这个

void xmpp_OnPresence(object sender, Presence pres)
    {
  this.Invoke(new MethodInvoker(delegate()
                {

listBox1.Items.Add(pres.From .User ); --- **HERE I AM GETTING ERROR.**

   }));
}

如果你看这一页的右边,有几十个关于同一主题的问题。我刚选了上面的那个。谢谢安德斯,@Henk,先生,我查了一些,但专业人士总是回答得很紧,所以我听不懂。谢谢你的建议,我会查的。