【问题标题】:How to give a TextBox type object to a thread如何将 TextBox 类型的对象赋予线程
【发布时间】:2012-11-24 07:16:21
【问题描述】:
private void button1_Click(object sender, EventArgs e)
{
    t = new Thread(new ParameterizedThreadStart(startRequest));
    t.Start(textBox1);
}

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

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

【问题讨论】:

  • 您是否尝试在 Windows 应用程序中创建后台线程来更改 WinForm 上控件的属性?不要那样做——这行不通。
  • 有什么办法吗?

标签: c# .net


【解决方案1】:

在使用其 Text 属性之前,您必须将 object 转换为类型 TextBox

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

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

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

【讨论】:

  • 我猜你应该指定casting的正常方式以及不使用的原因
  • 跨线程操作无效:控件 'textBox1' 从创建它的线程以外的线程访问。 - 现在这个:(
  • 看起来现在可以从另一个线程访问文本框,只能从主线程访问?
  • @Zecrow,你可以,我的代码有错误,请立即检查
  • 哇,是的,它工作了,但只是出于好奇,为什么这么复杂的代码?,只是为了添加一些文本......无论如何,谢谢
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    tempTextBox.Text = "hello";
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-17
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 2020-06-20
      • 2023-04-03
      相关资源
      最近更新 更多