Observable Subscribe 使用 sub 更改 ui 元素会导致错误

Observable Subscribe usage with sub that changes ui element causes error

我正在使用 Observal.subscribe 到 运行 一个更改标签值的子程序 使用此代码

 Dim observ As IObservable(Of Long) = System.Reactive.Linq.Observable.Interval(TimeSpan.FromSeconds(10))
    Dim source As New System.Threading.CancellationTokenSource()
    Dim action As Action = (Sub() ChangeLed())
    Dim resumeAction As Action = (Sub() ChangeLed())
    observ.Subscribe(Sub(x)
                         Dim task As New Task(action)
                         task.Start()
                         task.ContinueWith(Sub(c) resumeAction())
                     End Sub, source.Token)

上面提到的 changeled() sub 是通过示例

 private sub Changeled()
    If PingHost("myhostIP") Then
        label1.Content = "Connected"
    Else
        label1.Content = "Not Connected"
    End If 
 end sub

我有一个错误说:"The calling thread cannot access this object because a different thread owns it." 我知道我必须在这里使用 invoke By dispatcher 但我不知道在哪里。 ps:the pingHost 是一个函数,returns true 或 false 基于 ping 主机

您正在使用两种不同的并发模型:任务并行库 (TPL) 和 Rx。理想情况下,您会像这样只使用一个 (Rx):

observ.
    Select(Function(i) Pinghost("myHostIP")).
    ObserveOnDispatcher().
    Subscribe(Sub(pingResult)
                If pingResult Then
                    label1.Content = "Connected"
                Else
                    label1.Content = "Not Connected"
                End If
              End Sub, source.Token)

ObserveOnDispatcher 来自 nuget 包 System.Reactive.Windows.Threading.

如果您想保留您的 TPL 代码,那么我会更新 ChangeLed 如下:

Private Sub Changeled()
    If PingHost("myhostIP") Then
        this.Dispatcher.Invoke(Sub() label1.Content = "Connected")
    Else
        this.Dispatcher.Invoke(Sub() label1.Content = "Not Connected")
    End If
End Sub