c# Winform -通过线程更改控件工作得很好
本文关键字:控件 工作 很好 Winform -通 线程 | 更新日期: 2023-09-27 17:49:43
我使用的是VS 2012。谁能给一个简单的例子,为什么我需要控制。使用其他线程时调用/BeginInvoke。我试图通过其他线程更改文本框上的文本,但一切都很好。我知道在这种情况下,必须从gui线程调用更改。但我找不到例子,当某些东西不工作的线程也。谢谢你!Liron
我有这段代码,但它工作得很好: private void button1_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(ChangeText));
t.Start();
}
private void ChangeText()
{
for (int i = 0; i < 50; ++i)
{
textBox1.Text += "a";
Thread.Sleep(100);
}
}
好的,使用你的示例代码,假设你的UI中有一个按钮,当点击时,检查textBox1.Text
,如果它是"aaaaa",则将文本更改为"花生酱!"假设文本是"aaaaa",您恰好在ChangeText
中调用textBox1.Text
get
方法后立即单击按钮。在GUI线程上,您读取textBox1.Text
的当前值,您发现该属性等于"aaaaa",您将textBox1.Text
设置为"花生酱!",ChangeText
(在后台线程上)调用textBox1.Text
的set
方法将其更新为"aaaaaa"。应该发生的是,文本被设置为"花生酱!,但这就好像你从来没有改变任何从GUI线程。这是因为你的后台线程和前台线程所做的工作是交错的。这被称为竞争条件,可以通过调用Invoke
或BeginInvoke
来避免它,以确保只有一个线程在同一时间访问/修改数据。
你很少在你的代码中看到这类问题的原因是,计算机真的很快,在正确的时间点击这类错误的可能性非常低。一般来说,竞争线程越忙,您就越有可能看到竞争条件导致的问题。