これは安全ではありません。別のスレッドからコントロールを読み取っている間に、UI スレッドがコントロールの状態を変更する可能性があります (おそらくそうするでしょう)。あなたの読み取りは、中途半端な状態でコントロールをキャッチする可能性があります。今はうまくいっているように見えるかもしれませんが、遅かれ早かれ失敗するでしょう...おそらく予測不可能で壮観です。
いいえ、おそらく Invoke パターンを使用する必要はありません。率直に言って、そのパターンは通常最悪の選択肢です。通常は、ワーカー スレッドに手間のかかる作業を行わせてから、新しいデータまたは進行状況の情報をキュー経由で UI スレッドに送信し、UI スレッドがタイマー経由でこれを取得できるようにすることをお勧めします。これにはいくつかの利点があります。
- 高価な操作を排除し
Invoke
ますBeginInvoke
。
- UI スレッドは、ワーカー スレッドに命令させる代わりに、いつ、どのくらいの頻度で新しいデータを更新する必要があるかを決定します。
Invoke
ワーカー スレッドが戻るのを待つ必要がないため、ワーカー スレッドのスループットが向上します。
- の場合のように、UI メッセージ キューがオーバーランするリスクはありません
BeginInvoke
。
- UI とワーカー スレッドの相互作用を分離します。
ListView
を列挙し、ワーカー スレッドが安全にアクセスできる別のデータ構造を構築する必要があります。に多くの項目が含まれている場合はListView
、コントロールと連携して別のコレクションを維持することを検討してください。そうすれば、データに対処するというペナルティをより長い期間にわたって分散させることができます。結局、コピー操作によって UI スレッドがフリーズすることは望ましくありません。AConcurrentBag
などは、ワーカー スレッドが読み取り中に UI スレッドによって安全に変更できるため、適切な選択です。