c# - 设置文本框线程问题

标签 c# winforms multithreading textbox

我是 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/

相关文章:

c# - TF命令行工具: Compare local sourcecode files with shelved TFS files

vb.net - 无法建立索引,因为它没有默认属性错误

c# - 根据原始线程,以编程方式向 TableLayoutPanel 添加控件的行为不同

c# - VB.NET 窗体中的 AppSettings 如何工作?

java - 并发修改异常问题

Java 赋值问题——这是原子的吗?

C# 控制台 : Write while reading and retain structure

c# - 能够通过反射分配无效的枚举值

java - 将线程局部值保存在静态最终字段中是一个坏习惯吗?

c# - 在控件容器中捕获 Click/DoubleClick 事件?