ホームページ > バックエンド開発 > C++ > クロススレッド例外を回避するために、C# の別のスレッドから UI コントロールを安全に更新する方法

クロススレッド例外を回避するために、C# の別のスレッドから UI コントロールを安全に更新する方法

Linda Hamilton
リリース: 2025-01-23 02:26:10
オリジナル
683 人が閲覧しました

How to Safely Update UI Controls from a Separate Thread in C# to Avoid Cross-Thread Exceptions?

C# でのクロススレッド例外の回避: UI コントロールの安全な更新

問題: C# アプリケーションでは、メイン UI スレッド以外のスレッドから UI コントロールを更新するときに、「クロススレッド操作が無効です」という例外が頻繁に発生します。これは通常、マイクロコントローラーの UART ポートなどの外部ソースからのデータを別のスレッドで処理するときに発生します。

シナリオ: マイクロコントローラーが UART 経由で温度データを送信していると想像してください。 C# アプリケーションはこのデータをバックグラウンド スレッドで受信しますが、温度値を使用して TextBox を直接更新しようとすると例外がスローされます。

根本原因: UI コントロールは、作成されたスレッドにバインドされています。 別のスレッドからアクセスすると、このルールに違反します。

解決策: ディスパッチャーの活用

これを解決する鍵は、UI の更新が正しいスレッドで行われることを保証するメカニズムであるディスパッチャーを使用することです。 これには、シンプルだが効果的なパターンが含まれます:

  1. デリゲートの作成: UI 更新操作をカプセル化するデリゲートを定義します:

    <code class="language-csharp">delegate void SetTextCallback(string text);</code>
    ログイン後にコピー
  2. Update メソッドを実装します: このメソッドは、現在のスレッドが UI スレッドであるかどうかを確認します。そうでない場合は、Invoke を使用して更新を UI スレッドにマーシャリングします:

    <code class="language-csharp">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>
    ログイン後にコピー
  3. バックグラウンド スレッドからの更新: serialPort1_DataReceived イベント ハンドラー (または同等のもの) で、データの受信後に SetText メソッドを呼び出します:

    <code class="language-csharp">private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        string receivedData = serialPort1.ReadExisting();
        SetText(receivedData); 
    }</code>
    ログイン後にコピー

このアプローチにより、すべての UI 更新がメイン UI スレッドで安全に実行され、クロススレッド例外が防止されます。 InvokeRequired チェックは、更新がすでに正しいスレッド上にある状況を効率的に処理し、不要なオーバーヘッドを回避します。

以上がクロススレッド例外を回避するために、C# の別のスレッドから UI コントロールを安全に更新する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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