Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从不同的线程访问控件?_C#_Multithreading - Fatal编程技术网

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

C# 如何从不同的线程访问控件?,c#,multithreading,C#,Multithreading,如何从创建控件的线程以外的线程访问控件,以避免跨线程错误 以下是我的示例代码: private void Form1_Load(object sender, EventArgs e) { Thread t = new Thread(foo); t.Start(); } private void foo() { this.Text = "Test"; } 这有一个众所周知的小模式,它看起来是这样的: public void SetText(string text)

如何从创建控件的线程以外的线程访问控件,以避免跨线程错误

以下是我的示例代码:

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

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

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

public void SetText(string text) 
{
    if (this.InvokeRequired) 
    {
        this.Invoke(new Action<string>(SetText), text);
    }
    else 
    { 
        this.Text = text;
    }
}
您应该检查方法。

检查-


您应该使用invokererequired方法检查您是在同一个线程上还是在不同的线程上

MSDN参考:

您的方法可以这样重构

private void foo() {
    if (this.InvokeRequired)
        this.Invoke(new MethodInvoker(this.foo));
   else
        this.Text = "Test";       
}

关于堆栈溢出有很多问题。如果您是Winforms新手,我建议您从WPF开始。许多人可能不同意,但我认为Winforms已经死了。在WPF中,这个问题是通过对每个组件进行排队操作来解决的。复制大量潜在的重复项,而不是一次接近的投票。回答正确,但模式是众所周知的:)那么让我们交换这些词,因为我不是指未知的意义,只是“小模式”part.
Form.CheckForIllegalCrossThreadCalls=false-这正是我需要的。我只是从后台线程设置了几个计数器。没有什么逻辑上重要的东西,只是在屏幕上显示。我不在乎比赛条件。。。谢谢
private  void foo()
{
    if (this.InvokeRequired)
    {   
        this.Invoke(() => this.Text = text);
    }
    else
    {
        this.Text = text;
    }
}
private void foo() {
    if (this.InvokeRequired)
        this.Invoke(new MethodInvoker(this.foo));
   else
        this.Text = "Test";       
}