アプリケーションは動作しているので (まだ) 問題はありませんが、後で問題が発生しないように、何が起こっているのかを理解したいと考えています。(私は主にデータベース/Web アプリケーションのプログラマーなので、通常、スレッドは私のものではありません!)
短いバージョン: UI は、複数のスレッドが更新しているときにフォーム データをロックする必要がありますか?
特定のコンテンツのファイルをスキャンし、結果をユーザーに表示する単純な Winforms アプリケーション (DataGridViews を使用) があります。私は最初、これをすべて UI スレッドで行いましたが、それは良い考えではないことを知り、項目の [ProcessorCount] コレクションに ThreadPool.QueueUserWorkItem を使用することにしました。これは正常に機能し、デリゲートと BeginInvoke 機能を使用して、見つかった結果を UI に送信します。(ただし、結果が多すぎて UI がまだ遅れている場合もありますが、それは別の問題です。)
ワーカー スレッドは完全に分離されており、独自の処理を行っています。複数のスレッドの概念と、共有データへの同時アクセスに注意する必要があることを理解しています。ただし、さまざまなスレッドが UI スレッドを呼び出して UI スレッドを更新するとどうなるかは、完全にはわかりません。UI だけがコントロール (およびフォーム レベルの変数) を更新しますが、呼び出しは他のスレッドから行われるため、これはどのように実行されるのでしょうか? たとえば、リストに項目を追加したり、カウンターをインクリメントしたりする場合、あるワーカー スレッドからの呼び出しが別のワーカー スレッドに割り込むことはありますか? 各 BeginInvoke は独自の呼び出しですが、データの変更は依然として問題になる可能性があるようです。
私が見つけた BeginInvoke の例のどれも、UI でロックする必要性について言及していません。これらの 2 つのトピックは関連していますが、私が探している正確な答えはまだ得られません。