我正在尝试一个有趣的模式,使用 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 中抛出异常,则重新订阅序列并重新运行主体,并要求用户再次按下重置。
这段代码只有一个问题。第一次通过 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