私が通常行うことは、各スレッドにデータを収集させ、BeginInvoke 自体を GUI スレッドに送り、AutoResetEvent/Semaphore を待機させることです。GUI スレッドはメッセージを取得し、スレッド インスタンスからのデータを含むフォームなどを表示します。通常のコンポーネント コールバック (GUI スレッド コンテキスト内) は、スレッド メンバーにユーザーなどからの追加データをロードし、ユーザー入力フォームが閉じられるか、[OK] ボタンがクリックされると、イベント/セマを通知します。作業スレッドは、追加のユーザー データが読み込まれた状態で実行されます。
スレッド オブジェクトを BeginInvoke する必要はありません。必要に応じて、メンバー データとシグナルするイベントのみを含む他の 'ThreadComms' オブジェクトを投稿できます。
これは基本的に確実に機能する 1 つのソリューションであり、他にも間違いなく機能します。スレッドが 3 つある場合、いつでも 3 つのユーザー入力フォームがポップアップする可能性があるため、少し混乱することがあります (面倒なことに、スレッド 2/3 からの新しいフォームは、ユーザーが入力の途中でポップアップします)。スレッド 1 のフォーム)。
Invoke() を実行することもできますが、可能であれば、直接的な同期スレッド間通信を避けるようにしています。Invoke() とモーダル フォームは、ユーザーが入力に忙しいときに新しいフォームがポップアップする問題を解決するかもしれません。試してみませんか?