C# の「クロススレッド操作が無効です」エラーの解決
UI 要素を作成したスレッドとは異なるスレッドから UI 要素にアクセスしようとすると、「クロススレッド操作が無効です: コントロールは、作成されたスレッド以外のスレッドからアクセスされました」という恐ろしいエラーが発生します。 このエラーの理由は明らかですが、解決策が必ずしも明らかであるとは限りません。
別のスレッドから UI を安全に更新する方法は次のとおりです:
1. Control.Invoke
:
Control.Invoke
メソッドは、UI の更新をメインスレッドにマーシャリングする簡単な方法です。 UI 要素の操作をコントロールを所有するスレッドに委任します。 これにより、ListView
への項目の追加などのアクションが正しく実行されることが保証されます。Control.Invoke
はシンプルですが、スレッド切り替えのオーバーヘッドにより、特に大規模なデータセットの場合、パフォーマンスに影響を与える可能性があります。2. BackgroundWorker
:
BackgroundWorker
は、非同期操作を管理するためのより合理化されたアプローチを提供します。スレッドの作成と管理を処理するため、タスク自体に集中できます。RunWorkerCompleted
イベントは、バックグラウンド タスクが完了するとメイン スレッドで起動され、UI を更新するための安全なポイントを提供します。これにより、頻繁な Control.Invoke
呼び出しによるパフォーマンスのボトルネックが回避されます。Control.Invoke
または BackgroundWorker
を使用すると、安全かつ効率的な UI 更新を確保しながら、集中的な処理を別のスレッドにオフロードできます。 最適なアプローチの選択は、バックグラウンド タスクの複雑さとデータ量によって異なります。 より単純なタスクや小規模なデータセットの場合は、Control.Invoke
で十分な場合があります。大規模なタスクの場合、BackgroundWorker
はパフォーマンスと保守性が向上します。
以上がC# の別のスレッドから UI を安全に更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。