【问题标题】:Setting text boxes thread issues设置文本框线程问题
【发布时间】:2011-09-28 01:46:26
【问题描述】:

我是 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%的。所以现在我有一个接受字符串的方法的委托,我调用:

private delegate void stringDelegate(string s);

BeginInvoke(new stringDelegate(writeToIPBox), new object[] { e.ConnectedIP.ToString() });

private void writeToIPBox(string newIP)
        {
            txtConnectedID.Text = newIP;
        }

我不确定我为什么要这样做,这有什么不同。不知道为什么就这样做,我真的很不高兴。

提前致谢

【问题讨论】:

标签: c# winforms multithreading textbox


【解决方案1】:

您应该只尝试从创建控件的线程更新控件。这有充分的理由,因为很容易达到比赛条件。这些控件不是线程安全的,这是运行时可以帮助您。

相反,正如您所知道的,您需要在 UI 线程上更新它,这就是 BeginInvoke 正在做的事情;在 UI 线程上异步调用委托。

【讨论】:

    【解决方案2】:

    所有控件都属于 UI 线程(其中只有一个),并且尝试从另一个线程访问它们会导致此异常。

    BeginInvoke 在 UI 线程上调用指定的委托,这就是它起作用的原因。您还可以通过检查txtConnectedID.InvokeRequired 来检查您是否在 UI 线程上。

    【讨论】:

      【解决方案3】:

      我花了几分钟的时间在谷歌上搜索,但最终我找到了一个“权威”参考:

      http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired%28v=vs.90%29.aspx

      简短的回答(引用该页面)是:Windows 窗体中的控件绑定到特定线程并且不是线程安全的。

      本文还暗示了如何“在内部”处理此问题...如果control.InvokeRequired(即我们已从另一个线程调用)在内部处理调用...而不是在整个代码中传播委托。

      就我个人而言,我从来没有真正质疑过为什么需要代表,我只是这样做了。好问题。

      干杯。基思。

      【讨论】:

        【解决方案4】:
        private static void SetText(TextBox tb, string text)
        {
            if (tb.InvokeRequired)
            {
                var stDelegate = new StDelegate(SetText);
                tb.Invoke(stDelegate, new object[] { tb, text });
            }
            else
            {
                tb.Text = text;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-31
          相关资源
          最近更新 更多