.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>
Invoke
と BackgroundWorker
は両方とも、クロススレッド操作を処理するための安全なメカニズムを提供し、UI の更新が適切なスレッドでのみ行われるようにして、「クロススレッド操作が無効です」エラーを防ぎます。
以上がUI 更新のために .NET でクロススレッド操作を安全に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。