クロススレッドエラーの回避: 非 UI スレッドから UI 要素を安全に更新します
非 UI スレッド (シリアル ポート データ受信イベントによって生成されたスレッドなど) から UI 要素を操作する場合、クロススレッド エラーを回避するためにスレッド セーフティの問題を処理する必要があります。
C# コードでは、UI スレッドが textBox1 コントロールを所有しており、別のスレッドからそれにアクセスしているため、「無効なクロススレッド操作: コントロール 'textBox1' を作成したスレッド以外のスレッドからコントロール 'textBox1' にアクセスしています」というエラーが発生します。スレッドはスレッド アフィニティの競合を引き起こします。
この問題を解決するには、適切なスレッド (通常は UI スレッド) が UI 要素にアクセスできるようにするスケジューラーを使用する必要があります。この場合、デリゲートと Invoke メソッドを使用して、スレッドセーフなアクセスを確保できます。
<code class="language-csharp">delegate void SetTextCallback(string text); private void SetText(string text) { if (this.textBox1.InvokeRequired) { SetTextCallback d = new SetTextCallback(SetText); this.Invoke(d, new object[] { text }); } else { this.textBox1.Text = text; } }</code>
ここで、serialPort1_DataReceived イベント ハンドラー内で次のようにします:
<code class="language-csharp">private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { txt += serialPort1.ReadExisting().ToString(); SetText(txt.ToString()); }</code>
SetText メソッドを使用すると、textBox1 の text プロパティを更新するタスクを UI スレッドに委任でき、非 UI スレッドから UI 要素に安全かつエラーなくアクセスできるようになります。
以上がC# の非 UI スレッドから UI 要素を安全に更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。