ホームページ > バックエンド開発 > C++ > C# の非 UI スレッドから UI 要素を安全に更新するにはどうすればよいですか?

C# の非 UI スレッドから UI 要素を安全に更新するにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-23 02:14:15
オリジナル
248 人が閲覧しました

How to Safely Update UI Elements from Non-UI Threads in C#?

クロススレッドエラーの回避: 非 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート