ホームページ >バックエンド開発 >C++ >UI 更新のために .NET でクロススレッド操作を安全に処理するにはどうすればよいですか?

UI 更新のために .NET でクロススレッド操作を安全に処理するにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-12 17:07:46580ブラウズ

How to Safely Handle Cross-Thread Operations in .NET for UI Updates?

.NET UI 更新での「クロススレッド操作が無効です」エラーの回避

.NET では、UI 要素を作成したスレッドとは異なるスレッドから UI 要素を変更しようとすると、恐ろしい「クロススレッド操作が無効です」エラーが発生します。これは、UI 操作は、最初に UI 要素を作成したスレッドで実行する必要があるという重要なルールに由来しています。

コード例で説明してみましょう:

<code class="language-csharp">System.Threading.Thread t = new System.Threading.Thread(() =>
{
   // Perform intensive operations...
   listView1.Items.Add(lots of items); // Error prone line!
   // More UI updates...
});
t.Start();</code>

このコードは、タスクを処理するためのスレッドを生成します。 ただし、スレッドが UI を更新 (listView1 に項目を追加) しようとすると、更新がメイン UI スレッドで行われないため、エラーが発生します。

UI スレッドの安全なアプローチ

非 UI スレッドからの直接 UI 操作は禁止されています。 ここでは 2 つの効果的な解決策を紹介します:

  • Invoke メソッド: UI コントロールへの参照 (listView1 など) を所有している場合は、Invoke メソッドを使用します。 このメソッドは、UI スレッドでの実行のためにアクションをキューに入れます。

  • BackgroundWorker クラス: BackgroundWorker は、非同期操作を簡素化します。バックグラウンド スレッドを作成し、バックグラウンド スレッドと UI スレッド間の通信を容易にして、スレッド間の更新を管理しやすくします。

<code class="language-csharp">BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (s, e) => { /* Create items here */ };
bw.RunWorkerCompleted += (s, e) => { /* Update listView1 here */ };

bw.RunWorkerAsync();</code>

InvokeBackgroundWorker は両方とも、クロススレッド操作を処理するための安全なメカニズムを提供し、UI の更新が適切なスレッドでのみ行われるようにして、「クロススレッド操作が無効です」エラーを防ぎます。

以上がUI 更新のために .NET でクロススレッド操作を安全に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。