2

私は 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 を含むスレッドを生成し、それらのオブジェクトが互いに通信するようにする方法の例がいくつかあります。

4

2 に答える 2

2

BackgroundWorkerクラスを調べましたか? バックグラウンド タイプの手順で多くの単純化された処理を実行するのに最適であり、GUI 表示の進行を行うためにリストできるイベントを提供します。

于 2008-10-02T22:09:59.733 に答える
0

別のスレッドから WinForms コントロールを操作できますが、 を使用する必要がありControl.Invoke()、コンテキスト スイッチと関連する舞台裏の CLR ブードゥーのために、クロススレッド呼び出しごとにかなりのパフォーマンス ペナルティを支払うことになります。

マルチスレッド アプリケーションでビジネス ロジックとインフラストラクチャ コードから GUI を分離する場合は、スレッド セーフなキューを使用するメッセージング モデルに切り替えることをお勧めします。下位層が GUI に何かをするように指示する必要があるたびに、メッセージ オブジェクトをキューにドロップします。GUI 要素は、Forms.Timer. これは、更新タイマーの頻度を調整することで、GUI 更新の処理ニーズをある程度抑えることができるため、大規模でプロセッサを集中的に使用するアプリケーションに特に適しています。

逆方向 (GUI -> 下位レイヤー) に戻る呼び出しについては、それらの呼び出しが適度に迅速に返される限り、GUI コードからメディエーター メソッドを呼び出すことができます。GUI スレッドの遅延については十分に注意する必要があります。アプリケーション全体の応答性が低下します。すぐに戻るのが難しい通話がある場合は、別の方法で 2 つ目のキューを追加できます。

于 2008-10-03T13:16:07.597 に答える