MVP(Model、View、Presenter)をWinformで.net C#を使用して適用するソフトウェアを作成しています。私は長期間のタスクを処理するPresenterクラスを設計することに問題があります(計算と応答に時間を要します)。 私はインターネットで調査し、TPL Taskまたはasync/await on .net 4.5の使い方を知っています。しかし、そうすることで、私はそれを各行動に適用する必要があります。MVPでハンドルが長い実行タスク
ビューからアクションを受け取り、他のスレッド(Task、ThreadPoolなど)で自動的に実行し、クロススレッド例外なしでGUIに結果を戻すPresenterクラスを設計したいと思います。
例:私はRobotView、RobotPresenter、RobotControllerを持っています。すべてのアクションをRotbot deviveに送信します。 RobotViewクラスでは、私はHomeRobotというアクションを処理し、プレゼンターに電話します。プレゼンターで
Private Sub btnHome_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHome.Click
AVPLib.Log.guiLogger.Info("Enter btnHome_Click")
Dim strMessageText As String = String.Empty
Try
strMessageText = AVPLib.ContainerData.GetMessageText("HomeButtonCenterRobotCassettes")
If Utils.ShowAVPMessageBox(strMessageText, HOME_TM, MessageBoxIcon.Question) = DialogResult.OK Then
**_presenter.HomeRobot()**
AVPLib.ContainerData.LogAlarmEvent(AVPLib.ContainerData.TypeUser, AVPLib.ContainerData.LogSource.AVPMainScreen,
"[Main Screen]" & " Home Click")
End If
Catch ex As Exception
AVPLib.Log.avpLogger.Error(ex.ToString())
End Try
AVPLib.Log.guiLogger.Info("Leave btnHome_Click")
End Sub
:私はそう
Public Function HomeRobot() As Boolean
Dim result As Boolean = False
HEventLoggerWrapper.Debug("Enter HomeRobot.")
Try
_robotView.EnableDisableAllButton(False)
Dim taskResult As Task(Of Boolean) = Task.Run(Function() _robotController.SafetyHomeRobot())
taskResult.GetAwaiter().OnCompleted(Sub() result = taskResult.Result)
Catch ex As Exception
LogParameterUtility.LogErrorParameter(HEventLoggerWrapper.Logger,
[GetType]().Name,
"HomeRobot",
MethodBase.GetCurrentMethod(), ex)
End Try
HEventLoggerWrapper.Debug("Leave HomeRobot. Result = " & result)
Return result
End Function
(リターン応答を待ち、デバイスにコマンドを送信する)長い時間がかかるホームアクションを実行するためにRobotController(モデル)を呼び出し、それが働いたが、私はする必要がありすべてのアクション(ArmUp、ArmDown、Extend、Retract、...)に対してTask.Run/GetAwaiter ...を適用します。他のプレゼンター(他のデバイス)でも同じことをします。それは非常に無駄な時間です。
私はビュー呼び出しPresenter.DoSomeThingからのすべての関数が、長い実行タスクであるため、別のスレッドで自動的に実行されるように設計したいと思います。
ホープ誰かがこの問題には2つの可能なアプローチがあります
これまでに試したことのあるコードを表示してみませんか?あなたを助けるのがずっと簡単になるでしょう。 – SharpShade
あなたの具体的な問題は何ですか?あなたが言うことは正しいのですが、うまくいかないのですか?これまでの私の仮定:あなたは本当にTPLとasync/awaitの使い方を知りませんでした。ヒント:Presenterメソッドは '... async Task DoActionX()'として宣言されなければなりません。モデルメソッドは* async * 'Task'または' Task 'として宣言されなければなりません。状況に応じて 'await Model.DoActionX()。ConfigureAwait(...)'を使用する必要があるかもしれません(この記事[https://msdn.microsoft.com/en-us/magazine/jj991977.aspx ) 詳細については)。 –
SharpShade
明確な意味のコードを更新しました – user2927954