如何解决Dispatcher.BeginInvoke错误

时间:2015-05-24 19:08:18

标签: vb.net dispatcher begininvoke

我有这个程序(从C#转换):

Private Sub _biometrics_IdentifyFailed(ByVal sender As Object, ByVal e As AuthenticationFailedEventArgs)
    ' See comment above...
    Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, New Action(Function()
                                                                              StatusTextBox.Text = "Failed"
                                                                              UsernameTextBox.Text = [String].Empty
                                                                              _session.Close()
                                                                              _session = _biometrics.OpenSession()
                                                                          End Function))
End Sub

我在'Dispatcher.BegingInvoke'中遇到错误,说“对非共享成员的引用需要对象引用”。

我似乎无法弄清楚这意味着什么或如何解决它。

有人能理解并帮我解决吗?

这是一个Windows窗体应用程序,VS 2010,.NET framework 4.0。

感谢。

1 个答案:

答案 0 :(得分:1)

当前范围内没有Dispatcher属性。由于Dispatcher也是一种类型,因此编译器默认尝试调用Dispatcher类型上定义的 static BeginInvoke方法。没有,只有一个实例方法,这就是异常所说的内容。

正在做什么是您正在将WPF代码段复制到Windows窗体应用程序中。 Dispatcher 用于WPF应用程序。这被称为" god tier"应用开发。你不是在这个更高的领域内编程。因为这可以被孩子们阅读,所以我不会描述使用VB.NET进行Windows Forms开发的内容。

您可能正在尝试从后台线程更新UI。在这种情况下,您将使用Control.BeginInvoke从后台线程更新控件。你可能在控件的代码隐藏中,所以只需这样调用方法:

Private Sub _biometrics_IdentifyFailed(ByVal sender As Object, ByVal e As AuthenticationFailedEventArgs)
    ' See comment above...
    BeginInvoke(New InvokeDelegate(AddressOf InvokeMethod))
    _session.Close()
    _session = _biometrics.OpenSession()    
end Sub


Public Sub InvokeMethod()
    StatusTextBox.Text = "Failed"
    UsernameTextBox.Text = [String].Empty 
End Sub

请注意_biometrics_IdentifyFailed正在后台线程上执行,所以只有后台工作才会在那里进行。 InvokeMethod将在UI线程上执行,因此只有UI更新才会发生。我不是VB,因此我可能会遇到一些语法错误。祝你好运。