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);
        }
    }

c# Winform -通过线程更改控件工作得很好

好的,使用你的示例代码,假设你的UI中有一个按钮,当点击时,检查textBox1.Text,如果它是"aaaaa",则将文本更改为"花生酱!"假设文本是"aaaaa",您恰好在ChangeText中调用textBox1.Text get方法后立即单击按钮。在GUI线程上,您读取textBox1.Text的当前值,您发现该属性等于"aaaaa",您将textBox1.Text设置为"花生酱!",ChangeText(在后台线程上)调用textBox1.Textset方法将其更新为"aaaaaa"。应该发生的是,文本被设置为"花生酱!,但这就好像你从来没有改变任何从GUI线程。这是因为你的后台线程和前台线程所做的工作是交错的。这被称为竞争条件,可以通过调用InvokeBeginInvoke来避免它,以确保只有一个线程在同一时间访问/修改数据。

你很少在你的代码中看到这类问题的原因是,计算机真的很快,在正确的时间点击这类错误的可能性非常低。一般来说,竞争线程越忙,您就越有可能看到竞争条件导致的问题。