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;