1

我不是一个真正优秀的 C# 程序员。我习惯了 C 但不习惯 C#。

我知道从 UI 线程以外的线程我们无法更改文本框和标签的属性。

因此,在尝试了几种不同的方法之后,我一直在使用这种方法:

 item.Invoke(new EventHandler(delegate
            {
                item.Text = text;
            }));

然后在写了一些代码之后,我发现每次都这样做很无聊而且效率低下,所以我做了一个方法:

static void change_text_from_different_thread(TextBox item, string text)
        {
            item.Invoke(new EventHandler(delegate
            {
                item.Text = text;
            }));

        }

然后我尝试在我的线程中使用它,问题是我无法从线程发送 TextBox。

假设这是我的线程:

{

change_text_from_different_thread(textbox1,"Hi");

}

然后我得到这个错误:

非静态字段、方法或属性需要对象引用

那么你能告诉我如何传递文本框吗?顺便说一句,我的调用方法有可能是错误的或非常危险的,但我找不到更简单的方法。如果真的很糟糕,请告诉我。如果没问题,也请告诉我。如果通过使用另一种方法,事情变得更好更容易,请也告诉我。

这是我第一次问问题,如果我错过了一些东西,对不起。非常感谢。

这是我的方法:

static void gyro_self_check_thread_function()
{
//lab lab
}

这就是我创建线程并启动它的方式:

private void Gyro_self_check_button_Click(object sender, EventArgs e)
        {

            Gyro_self_check_status_label.Text = "Status: Checking....";
            gyro_self_testing_groupBox.Update();
            _serialPort.Write(Protocal_Values.gyro_self_checking_request, 0, 2);


            Thread gyro_self_check_thread = new Thread(gyro_self_check_thread_function);
            gyro_self_check_thread.Start();

            //Thread gyro_self_check_thread = new Thread(gyro_self_check_thread);
            //gyro_self_check_thread.Start();



        }
4

2 回答 2

0

看起来您的线程方法也是静态的,而 textbox1 是一个非静态字段,因此无法从静态方法访问它。

如果是这种情况,那么您可以使您的线程方法非静态并且它应该编译。

于 2013-04-23T20:09:59.133 回答
0

正如另一位发表评论的那样,这可能是静态访问与非静态访问的问题。为了缓解这个问题,您可以将其编写为 TextBox 上的扩展方法:

static class ExtensionMethods
{
     static void change_text_from_different_thread(this TextBox item, string text)
     {
         item.Invoke(new EventHandler(delegate
             {
                 item.Text = text;
             }));

     }
}

然后你这样称呼它:

textbox1.change_text_from_different_thread("Hi");
于 2013-04-23T20:15:51.740 回答