跨线程操作“倒退”

时间:2012-01-19 12:50:43

标签: c# multithreading

我有一个程序监视任何数据的TCP连接,并在收到整个邮件时触发事件。侦听器与UI线程位于不同的线程上。触发事件时,如果消息需要更改UI,我将使用当前更改调用Form。如果此命令被命中,则触发事件的侦听器中的函数会标记跨线程操作无效错误。我不明白为什么调用该事件的线程会在我试图通过调用来避免该错误时标记该错误。例如:

没有命令上的Invoke:

if (cmd == "NEWID")
{
    usr = new User(usr.Name, int.Parse(NW_Connector.GetWord(msg, 1)));
    this.Text = "Note It - " + usr.Name + "(" + usr.ID + ")"; //Cross-Thread Here
}

交叉线程在this.Text更改时被标记。

当我添加Invoke时:

if (cmd == "NEWID")
{
    usr = new User(usr.Name, int.Parse(NW_Connector.GetWord(msg, 1)));
    this.Invoke(new MethodInvoker(delegate { this.Text = "Note It - " + usr.Name + "(" + usr.ID + ")"; }));
}

在触发事件的函数上标记了交叉线程:

if (NewMessage != null && NetworkConnectionState != ConnectionState.Closing)
    NewMessage(this, cl, data); //Cross-Thread Here

NewMessage函数是注册到的事件:

    public delegate void RecievedMessage(object sender, Client messageSender, byte[] message);
    public event RecievedMessage NewMessage;

我不明白为什么在调用正确的线程时交叉线程被“移动”了。任何帮助都是神奇的!

1 个答案:

答案 0 :(得分:0)

我完全不知道为什么,但是进行完全重建(重建解决方案中的每个项目)纠正了这个问题。问题一定是因为我正在改变的项目的源代码与操作程序源不同,它在堆栈跟踪上可用的最接近的有效源代码上显示了跨线程错误。

奇怪的是,我没有被告知源代码不同但是它确定了问题。我希望这会帮助其他人解决同样的问题。它真的吓坏了我为什么跨线程问题似乎“回落”到堆栈跟踪中的先前位置。