C# 文本框和线程

C# 文本框和线程,c#,textbox,C#,Textbox,为什么这样不行 程序在以下位置停止:this.textBox1.Text=“(新文本)” 在windows中,控件只能由创建它的线程更新。您需要使用Control.Invoke对UI线程进行方法调用以更新文本 MSDN页面上有一个例子。从后台线程执行这些操作时,需要使用控件。调用: private void ThreadProcUnsafe() { while (true) { Thread.Sleep(2000); textBox1.Invoke

为什么这样不行

程序在以下位置停止:
this.textBox1.Text=“(新文本)”


在windows中,控件只能由创建它的线程更新。您需要使用
Control.Invoke
对UI线程进行方法调用以更新文本


MSDN页面上有一个例子。

从后台线程执行这些操作时,需要使用
控件。调用

private void ThreadProcUnsafe()
{
    while (true)
    {
        Thread.Sleep(2000);
        textBox1.Invoke(new Action(() =>
        {
            textBox1.Text = "(New Text)";
        }));
    }
}
如果您正在编写可以从后台线程运行的通用代码,还可以检查
控件.invokererequired
属性,如中所示:

if (textBox1.InvokeRequired)
{
    textBox1.Invoke(...);
}
else
{
    // Original code here
}

不允许对Windows控件进行跨线程访问。您需要另一种不那么直接的机制,如事件或消息传递


关于控件.Invoke问题,以及为什么BeginInvoke是一个更好的选择,因为死锁的可能性较小。

尽管我建议使用
Invoke
BeginInvoke
(当然,在调用
InvokeRequired
之后),您可以通过从窗体或用户控件调用它来完全防止跨线程异常:

CheckForIllegalCrossThreadCalls = false;
CheckForIllegalCrossThreadCalls
Control
的静态属性)


如果您选择这样做,您的UI中可能会出现一些奇怪的结果。

您可以使用this.invokererequired方法查看正在执行的线程是否是UI线程。如果.InvokeRequired为false,则可以安全地更新控件的.Text属性。绝对-但在他的示例中,它是必需的。
CheckForIllegalCrossThreadCalls = false;