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

別の投稿がコメントしたように、これはおそらく静的アクセスと非静的アクセスの問題です。この問題を軽減するために、これを 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 に答える
0

スレッド メソッドも静的であり、textbox1 は非静的フィールドであるため、静的メソッドからアクセスできません。

この場合、スレッド メソッドを非静的にすることができ、コンパイルする必要があります。

于 2013-04-23T20:09:59.133 に答える