在C#中的线程内更改表单上的文本

时间:2012-10-12 08:35:35

标签: c# multithreading forms textbox

我正在尝试将我的Form1文本框中的文本从一个帖子中更改为“hello there”。 但是当我执行它时,我得到错误“对象引用未设置为对象的实例”。 当我检查时,我看到txtboxCheckedFiels有一个Null值。

我如何创建该txtbox的对象? (我运行多个线程,所有线程都应该能够更改该文本。

我试过的代码:

txtboxCheckedFiles.Invoke(new Action(() =>
                {
                    txtboxCheckedFiles.Text = "Hello there";
                }));

我尝试的另一种方式

var t = new Thread(
o => 
{
     txtboxCheckedFiles.BeginInvoke(
         ((Action)(() => txtboxCheckedFiles.Text = "Hello there")));
});

2 个答案:

答案 0 :(得分:2)

它可能是相同的...但这是我一直使用的:

    public void LabelWrite(string value)
    {
        if (InvokeRequired)
            Invoke(new LabelWriteDelegate(LabelWrite), value);
        else
        {
            textBox1.Text = value;
        }
    }
    delegate void LabelWriteDelegate(string value);

就像一个魅力......你基本上可以在else {}中写下你想要的任何东西。

答案 1 :(得分:1)

首先,您必须检查是否需要调用,然后您可以调用它。 另外,考虑检查窗口是否有句柄,这意味着窗口已启动并运行(例如,如果您尝试在表单的构造函数中加载数据,则会失败)

if (this.InvokeRequired)
{
    IAsyncResult result = BeginInvoke(new MethodInvoker(delegate()
    {
        // DOSTUFF
    }));

    // wait until invocation is completed
    EndInvoke(result);
}
else if (this.IsHandleCreated)
{
    // DO STUFF
}