C# 如何为线程指定TextBox类型的对象

C# 如何为线程指定TextBox类型的对象,c#,.net,C#,.net,这里我得到了一个错误,textBox1没有属性文本,在主线程中一切正常,但在新线程中我得到了一个错误,如何解决这个问题?在使用其文本属性之前,必须将对象转换为键入TextBox private void button1_Click(object sender, EventArgs e) { t = new Thread(new ParameterizedThreadStart(startRequest)); t.Start(textBox1); } void startRequ

这里我得到了一个错误,textBox1没有属性文本,在主线程中一切正常,但在新线程中我得到了一个错误,如何解决这个问题?

在使用其文本属性之前,必须将
对象转换为键入
TextBox

private void button1_Click(object sender, EventArgs e)
{
    t = new Thread(new ParameterizedThreadStart(startRequest));
    t.Start(textBox1);
}

void startRequest(object textBox1)
{
    textBox1.Text = "hello";
}

如果强制转换失败,最好检查null

在使用
对象的Text属性之前,必须将其强制转换为键入
TextBox

private void button1_Click(object sender, EventArgs e)
{
    t = new Thread(new ParameterizedThreadStart(startRequest));
    t.Start(textBox1);
}

void startRequest(object textBox1)
{
    textBox1.Text = "hello";
}

如果强制转换失败,最好检查null

对象没有属性,您需要将
类型cast
对象转换为
文本框
,您将无法访问文本框,尽管当前线程不是
GUI线程
。您可以使用
MethodInvoker
调用GUI线程中的代码,如下所示

void startRequest(object textBox1)
{
    MethodInvoker mi = delegate
    {
        TextBox tempTextBox = textBox1 as TextBox;
        if (tempTextBox != null)
            tempTextBox.Text = "hello";
    };

    if (this.InvokeRequired)
        this.Invoke(mi);
}

对象没有属性,您需要将
键入cast
对象到
文本框
,但您将无法访问文本框,因为当前线程不是
GUI线程
。您可以使用
MethodInvoker
调用GUI线程中的代码,如下所示

void startRequest(object textBox1)
{
    MethodInvoker mi = delegate
    {
        TextBox tempTextBox = textBox1 as TextBox;
        if (tempTextBox != null)
            tempTextBox.Text = "hello";
    };

    if (this.InvokeRequired)
        this.Invoke(mi);
}

您不能从UI线程以外的线程访问UI组件。你会在这里得到例外

void startRequest(object textBox1)
{
    MethodInvoker mi = delegate {         
        ((TextBox) textBox1).Text = "hello";
    }
    if(InvokeRequired)
       this.Invoke(mi);
}

如果您试图从另一个线程执行此操作。

您不能从UI线程以外的线程访问UI组件。你会在这里得到例外

void startRequest(object textBox1)
{
    MethodInvoker mi = delegate {         
        ((TextBox) textBox1).Text = "hello";
    }
    if(InvokeRequired)
       this.Invoke(mi);
}

如果您尝试从另一个线程执行此操作。

是否尝试在Windows应用程序中创建后台线程以更改WinForm上控件的属性?不要这样做-这行不通。有什么方法可以这样做吗?您是否正在尝试在Windows应用程序中创建后台线程以更改WinForm上控件的属性?不要这样做-这不起作用。有什么方法可以这样做吗?我想你应该指定
强制转换的正常方法以及不使用它的原因Cross thread operation not valid:控件“textBox1”是从创建它的线程以外的线程访问的。-现在:(看起来现在有办法从另一个线程访问文本框,只能从主线程访问?@Zecrow,你可以,我的代码中有一个错误,现在检查plzWow,是的,它工作了,但只是出于好奇,为什么这么复杂的代码?只是为了添加一些文本…无论如何,我想你应该指定
转换的正常方式以及原因。)n不使用itCross thread操作无效:控件“textBox1”是从创建它的线程以外的线程访问的。-现在:(看起来现在有办法从另一个线程访问文本框,只能从主线程?@Zecrow,你可以,我的代码中有一个错误,现在检查plzWow,是的,它工作了,但只是出于好奇,为什么这么复杂的代码?只是为了添加一些文本…无论如何,谢谢