我是 C# 的新手,如果这是一个有点愚蠢的问题,请原谅我。 无论如何,我正在编写一个到目前为止似乎进展顺利的小聊天应用程序,我遇到了一个我似乎已经解决的问题,但我希望弄清楚为什么我需要这样做。
当我收到一条消息时,我想更新一个文本框,所以我使用:
txtConnectedID.Text = "test";
但是我收到这个错误:
System.InvalidOperationException was unhandled by user code
Message=Cross-thread operation not valid: Control 'txtConnectedID' accessed from a thread other than the thread it was created on.
现在,我认为这与停止运行两次且未正确更新的方法有关?我对此不是100%。所以现在我有一个接受字符串的方法的委托(delegate),我调用:
private delegate void stringDelegate(string s);
BeginInvoke(new stringDelegate(writeToIPBox), new object[] { e.ConnectedIP.ToString() });
private void writeToIPBox(string newIP)
{
txtConnectedID.Text = newIP;
}
我不确定我为什么要这样做,它有什么不同。在不知道为什么的情况下就这样做,我真的很不高兴。
提前致谢
最佳答案
您应该只尝试从创建它们的线程更新控件。这有充分的理由,因为很容易达到竞争条件。这些控件不是线程安全的,这是运行时帮助您解决的问题。
相反,如您所知,您需要在 UI 线程上更新它,这就是 BeginInvoke
正在做的事情;在 UI 线程上异步调用委托(delegate)。
关于c# - 设置文本框线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6570584/