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
我正在使用 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