Invoke
コントロールへのクロススレッド呼び出しは許可されていないため、他のスレッドでのコントロールが必要です。この制限が存在する理由に関するより完全な議論については、そのリンクを読む必要があります-ここでは答えません。
呼び出しInvoke
は、バックグラウンド スレッドが UI スレッドで "何かを行う" ことを可能にするため、私たちを助けてくれます。メソッドを直接呼び出すのではなく、"機会があれば実行してください"というWindows メッセージを送信するため機能します。UI スレッドは、そのスレッドに送信されたすべてのメッセージを継続的に処理するメッセージ ポンプを実行しています。多くの場合、これらのメッセージは"ユーザーがこのボタンをクリックしました" のようなものです。この場合、Windows フォームはClick
、関連するコントロールでイベントを発生させることによってこのメッセージを処理します。この場合、Windows フォームは、指定されたデリゲートを実行してメッセージを処理します。
その結果、任意の時点で 1 つのスレッド (UI スレッド) だけが UI コントロールを変更または操作することになります。
Invoke
デリゲートが実行される順序については保証されないことに注意してください。Invoked
2 つの異なるスレッド (または同じスレッド) からの 2つのデリゲートが正しい順序で実行されることが重要である場合、それは別の問題です。
余談:ほとんどのアプリケーションにはすべてのコントロールが作成される 1 つのスレッドがあるため、"UI スレッド" について説明しますが、実際にはさまざまなコントロールをスレッドで作成できます。つまり、メッセージを処理するコントロールが作成されたスレッドです。これらのメッセージが適切に処理されるためには、明らかに、そのスレッドでメッセージ ポンプが実行されている必要があります。