如何在WPF VB.net中对Windows窗体控件进行线程安全调用

如何在WPF VB.net中对Windows窗体控件进行线程安全调用,vb.net,xaml,Vb.net,Xaml,我正在尝试对WPF VB.net中的表单控件进行安全调用,但我无法做到这一点。通常我是通过一个代理完成的,但显然在WPF中是不同的。 有什么想法吗??你好 Delegate Sub SetTextCallback(ByVal text As String) Private Sub SetText(ByVal text As String) If lProcess.InvokeRequired Then Dim d As New S

我正在尝试对WPF VB.net中的表单控件进行安全调用,但我无法做到这一点。通常我是通过一个代理完成的,但显然在WPF中是不同的。 有什么想法吗??你好

Delegate Sub SetTextCallback(ByVal text As String)

    Private Sub SetText(ByVal text As String)
            If lProcess.InvokeRequired Then
                Dim d As New SetTextCallback(AddressOf SetText)
                Me.Invoke(d, New Object() {text})
            Else
                Me.lProcess.Text = text
            End If
            Application.DoEvents()
        End Sub

您不需要声明自己的委托。只需使用适当的
操作
函数
。您也不需要显式地为参数创建数组,因为
Invoke
接受
ParamArray

Private Sub-SetText(ByVal文本作为字符串)
如果是Me.Dispatcher.CheckAccess(),则
“我们在UI线程上。
Me.lProcess.Text=文本
其他的
“我们正处于次要阶段。
Dim d作为新动作(字符串)(SetText的地址)
Me.Dispatcher.Invoke(d,text)
如果结束
端接头
这是未经测试的,但我认为它应该起作用。我从未在WPF中使用WinForms控件,因此实际设置
文本的行可能无效,但我假设您已经知道如何执行该部分


基本上,
Dispatcher.Invoke
Control.Invoke
Dispatcher.CheckAccess
Control.invokererequired
几乎相同,只是结果相反。

请退出我的。突出显示的文章展示了如何在WPF应用程序中封送对UI线程的方法调用。一旦进入该线程,就可以直接访问WinForms控件。你可能想阅读前面的文章了解背景。请注意,下面的文章提供了一种方法,可以从任何代码执行在WinForms和WPF中工作的相同操作,即使该代码不支持UI,例如可以在这两种类型的应用程序中使用的库代码。请注意,此时不鼓励使用“谢谢”之类的注释。向上投票并接受答案是表示感谢的方式。声誉低于15的人所投的票会被记录下来,但不会改变公开显示的帖子分数。;)