如何从不同的线程访问控件?

4

如何在创建控件的线程之外的线程中访问控件,避免跨线程错误?

以下是我的示例代码:

private void Form1_Load(object sender, EventArgs e)
{
    Thread t = new Thread(foo);
    t.Start();
}

private  void foo()
{
    this.Text = "Test";
}

2
有很多关于这个问题的Stack Overflow上的问题。 - ChrisF
如果你是Winforms的新手,我建议从WPF开始。很多人可能不同意,但在我看来,Winforms已经死了。在WPF中,通过将操作排队到每个组件来解决了这个问题。 - Gilad
重复的问题:https://dev59.com/_nVC5IYBdhLWcg3w7V33 http://stackoverflow.com/questions/3650109/cross-thread-operation-not-valid-control-textbox1-accessed-any-help-plz http://stackoverflow.com/questions/1809864/how-to-access-a-form-control-from-system-timers-timer-cross-thread-problem - gideon
很多潜在的重复问题,却没有一个关闭投票。 - Robert Harvey
4个回答

14

这是一个众所周知的小模式,它看起来像这样:

public void SetText(string text) 
{
    if (this.InvokeRequired) 
    {
        this.Invoke(new Action<string>(SetText), text);
    }
    else 
    { 
        this.Text = text;
    }
}

还有一种快速而不太可靠的解决方法,我建议只在测试时使用。

Form.CheckForIllegalCrossThreadCalls = false;

正确的答案,只是这个模式在我看来非常出名 :) - Frederik Gheysels
那我们交换一下这些词吧,因为我并不是指未知的意思,只是“小模式”部分。 - John Leidegren
Form.CheckForIllegalCrossThreadCalls = false; - 这正是我所需要的。我只需要从后台线程设置一些计数器。这些计数器对逻辑并不重要,只是为了在屏幕上显示。我不关心竞争条件...谢谢! - vt100

2

2

您应该检查Invoke方法。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接