例外の再試行にRX拡張機能を使用して、試している興味深いパターンがあります。私は次のコードを持っています。
Public Async Function InitializeCommunications() As Task
Await Observable.Create(Of Unit)(Async Function(observer)
MessageBox.Show("Please press reset")
Await Me.Cockpit.LoadDriverToPLC()
MessageBox.Show("Please press start")
observer.OnNext(Unit.Default)
End Function).Retry()
End Function
コードはほぼ完全に機能します。LoadDriverToPLCで例外がスローされた場合、シーケンスが再サブスクライブされ、本体が再実行され、ユーザーはリセットをもう一度押すように求められます。
このコードには1つだけ問題があります。初めてのMessageBox呼び出しは、正しくモーダルです。つまり、メインウィンドウの上に乗っており、誤ってメインウィンドウをクリックして非表示にすることはできません。ただし、例外がスローされて本文が再試行された場合、MessageBox呼び出しはモーダルではなくなります。
これはRXスケジュールに関係していると確信しています。体が常に同じコンテキストで実行されるようにするための秘訣は何ですか?
後でこのパターンを信頼できるものにできるようになったら、このパターンをラップするつもりです。
Public Async Function InitializeCommunications() As Task
Await RetryOn(of Exception)(Async Sub()
MessageBox.Show("Please press reset")
Await Me.Cockpit.LoadDriverToPLC()
MessageBox.Show("Please press start")
End Sub)
End Function