私は MVP スタイルで Windows フォーム アプリケーションを実行しようとしていますが、これまでスレッド化をあまり行っていなかったので、混乱しています。
私の UI は非常に単純なフォームのセットです。各フォームはインターフェイスを実装し、ビジネス ロジック レイヤーに存在するメディエーター クラスへの参照を含み、その逆も同様です。したがって、簡略化された図は次のようになります。
CheckInForm : ICheckIn <-------> CheckInMediator : ICheckInMediator
----------------------------------------------------------------------------------------
CheckInForm.Show() <--------
--------> AttemptCheckIn(CheckInInfo)
CheckInForm.DisplayCheckInInfo(DisplayInfo) <--------
--------> CompleteCheckIn(AdditionalCheckInInfo)
PleaseWaitDialog.Show() <--------
PleaseWaitDialog.Close() <--------
CheckInForm.Close() <--------
ご覧のとおり、メディエーター クラスは UI を制御し、データの表示、起動、終了などのタイミングを伝えます。モーダル ダイアログを表示するタイミングと閉じるタイミング (上記の PleaseWaitDialog) も指定します。 UI は、画面にデータを表示し、入力をメディエーターに中継します。
このアーキテクチャは素晴らしく分離されており、テストとプロトタイプ作成が非常に簡単です。すべてをまとめているので、スレッドの問題が発生し始めています。たとえば、メディエーターによって制御されるタイマーが 5 秒カウントされるまで (ShowDialog() を使用して) CheckInForm の上にモーダル フォームとして PleaseWaitDialog を表示する場合 (これは単純化されていることを思い出してください)、クロススレッド エラーが発生します。タイマーのコールバックから PleaseWaitDialog.Close() を呼び出した場合。同様に、モーダル ダイアログでユーザーが UI を操作するのをブロックする場合、別の方法 (確認ダイアログなど) を指定しない限り、ビジネス レイヤーでのアクティビティをブロックしたくありません。
私がやりたいと思っていることは、メディエーターとビジネス ロジックをメイン スレッドで実行し、UI を完全に別のスレッドで実行することです。
2 番目の質問は、別のスレッドでクラスを実行するなどの方法を教えてください。そして、どうすれば2人に通信させることができますか? 私は .NET スレッドについて読み進めていますが、締め切りがあり、メイン スレッドのクラスで UI を含むスレッドを生成し、それらのオブジェクトが互いに通信するようにする方法の例がいくつかあります。