UI アップデートにおけるクロススレッド操作の例外への取り組み
UI 要素を作成したスレッド以外のスレッドから UI 要素を変更しようとすると、恐ろしい「クロススレッド操作が無効です」という例外が発生します。 これは、UI コントロールが元のスレッドによってのみアクセスされるように設計されているためです。
この問題は、バックグラウンド スレッドから ListView (または同様のコントロール) に項目を追加するときによく発生します。 これに対処するいくつかの方法を次に示します。
1.メインスレッドで UI の更新を維持する
最も簡単な解決策: クロススレッド操作を完全に回避します。 ListView への項目の追加など、UI 関連のコードをメイン UI スレッドに再配置します。 例:
<code class="language-csharp">listView1.Items.Add(lots of items); // Additional UI updates</code>
2. Invoke メソッドの活用
別のスレッドから UI を更新する必要がある場合は、Invoke
メソッドを使用してコードをメイン スレッドにマーシャリングして戻します。
<code class="language-csharp">Form1.Invoke((Action)(() => { listView1.Items.Add(lots of items); // Other UI-related changes }));</code>
3. BackgroundWorker を雇用中
BackgroundWorker
クラスは、非同期操作に対するより構造化されたアプローチを提供します。 これにより、イベントを使用してメインスレッドで UI を更新しながら、バックグラウンド スレッドで長時間実行タスクを実行できます。
<code class="language-csharp">BackgroundWorker bw = new BackgroundWorker(); bw.DoWork += (s, e) => { /* Item creation on background thread */ }; bw.RunWorkerCompleted += (s, e) => { /* UI update on main thread */ }; bw.RunWorkerAsync();</code>
適切なソリューションの選択
最適な方法は、UI 更新の複雑さによって異なります。マイナーアップデートの場合は、多くの場合、Invoke
メソッドで十分です。 より複雑なシナリオの場合、BackgroundWorker
はより優れたパフォーマンスと同時実行管理を提供します。 どちらの選択をするにしても、競合状態やその他の同時実行関連の問題を防ぐために、スレッドの同期を慎重に管理することを忘れないでください。
以上がUI コントロールを更新する際の「クロススレッド操作が無効です」例外を解決する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。