C# でシリアル ポートから TextBox を更新する際のクロススレッド例外を解決する
C# シリアル通信における一般的な問題には、serialPort1_DataReceived
イベント ハンドラーからの TextBox の更新が含まれます。 シリアル ポートは別のスレッドで動作するため、このイベント ハンドラーから TextBox に直接アクセスすると、「クロススレッド操作が無効です」例外がスローされます。
この解決策には、TextBox のテキストを更新するためのスレッドセーフなメソッドが必要です。 これは、更新を UI スレッドにマーシャリングして戻すことで実現されます。 その方法は次のとおりです:
<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>
この SetText
メソッドは、現在のスレッドが UI スレッド (textBox1.InvokeRequired
) であるかどうかを確認します。そうでない場合は、Invoke
を使用して SetText
コールバックを UI スレッドにマーシャリングし、スレッドの安全性を確保します。 それ以外の場合は、TextBox を直接更新します。
これを serialPort1_DataReceived
イベント ハンドラーに統合する方法は次のとおりです。
<code class="language-csharp">private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { string receivedData = serialPort1.ReadExisting(); SetText(receivedData); // Use the thread-safe SetText method }</code>
この改訂されたイベント ハンドラーはシリアル ポートからデータを読み取り、SetText
メソッドを使用して TextBox を安全に更新し、クロススレッド例外を防ぎます。 このアプローチにより、UI の更新が常に正しいスレッドで実行されることが保証され、アプリケーションの安定性が維持されます。
以上がC# のシリアル ポートから TextBox を安全に更新する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。