似乎C#有时会抛出跨线程操作的异常。例如,您可以尝试在Windows窗体程序中运行此示例代码:
public Form1()
{
InitializeComponent();
Thread setTextT = new Thread(TextSetter);
setTextT.Start();
}
private void TextSetter()
{
//Thread.Sleep(4000);
textBox1.Text = "Hello World";
}
它没有抛出任何异常,一切似乎都运行正常。现在,当您取消注释Thread.Sleep行时,它将为尝试的跨线程访问抛出异常。
为什么会这样?
答案 0 :(得分:5)
这是因为交叉线程检查仅在创建the window's handle之后发生,因为您要检查的是对窗口句柄的跨线程访问。当您没有睡眠时,代码会在第一次显示控件之前运行得足够快(第一次显示控件时会创建句柄)。
知道是否需要注意UI控件的跨线程访问的简单方法只需检查InvokeRequired
,如果确实如此,则需要调用Invoke
(或{{1}如果你不想等待它完成)来获得创建控件的线程。
答案 1 :(得分:0)
试试这个:
public Form1()
{
InitializeComponent();
Thread setTextT = new Thread(TextSetter);
setTextT.Start();
}
private void TextSetter()
{
//Thread.Sleep(4000);
//textBox1.Text = "Hello World";
//You have to Invoke your action to the UI thread
Invoke(new Action(()=>textBox1.Text = "Hello World"));
}