スレッドの実行は、メイン アプリケーションからかなり分離されていることがわかりました。変数 (クラスでグローバルに宣言されている) を変更することはできず、スレッド内で新しい値を与えるだけでは、フォーム プロパティなどを変更することはできません。
スレッドが実行されると、スレッド内からラベルのテキストを変更するにはどうすればよいでしょうか?
メインプログラムで使用されていないため、値をロックする必要はないと思うので、デッドロックは発生しません。
私が試したこと、それは失敗しました。
グローバル変数を持つ (int = 0)
テスト スレッドを実行して、変数を 5 に変更します。
その番号をスレッドの外に表示したい場合(messagebox.show(int.tostring())) var はまだ 0 です
スレッド内からメイン フォームの内容を変更するにはどうすればよいでしょうか。
コード
私が使用しなかったスレッドを作成するこのコードはこれでした。
Thread threadA = new Thread(new ThreadStart(DoWork));
threadA.Start();
その方法を使用すると、エラーが発生します
「クロススレッド操作が無効です: コントロール 'button1' は、それが作成されたスレッド以外のスレッドからアクセスされました」
スレッドで何かを編集または変更しようとしたとき。
だから私はこのコードを使用しました。
lbldirectory は、部分クラスの名前です。
// StartFileCheckProcess();
workerObject = new lbldirectory();
workerThread = new Thread(workerObject.DoWork);
// the worker thread.
workerThread.Start();
DoWork は、フォームのプロパティを変更しようとするクラスです。
これは DoWork クラスです。それは本当に単純なクラスですが、なぜこれが起こるのかを理解するだけであり、他の人はその理由とこれを克服する方法を理解するだけです.
public void DoWork()
{
button1.Text = "Hello there";
}
これでスレッドが実行され、スレッドが機能します。フォームの何も変更できません。
修正された回答 (Tudor と Konstantin Vasilcov 提供)
ボタンクリックイベント。
var t = new Thread(TEST);
t.Start();
スレッドが開始するクラス
private void TEST()
{
for (int i = 0; i < 10; i++)
{
lbl_CurrentFile.BeginInvoke(
((Action)(() => lbl_CurrentFile.Text = i.ToString())));
Thread.Sleep(1000);
}
}
スレッド内のラベルのテキストを正常に変更します