代码之家  ›  专栏  ›  技术社区  ›  MattB

奇怪的WPF交叉螺纹问题

  •  0
  • MattB  · 技术社区  · 10 年前

    我想我知道如何解决这个问题,但如果有人比我要实施的想法更好,请告诉我。

    我知道,当试图从另一个线程访问UI线程上的控件的属性时,需要调用-但我遇到了一个事件的问题,该事件给了我旧的“ The calling thread cannot access this object because a different thread owns it. “错误。

    现在我的印象是UI线程上发生了事件,因此这种跨线程异常不应该有问题。。。这是我的XML:

    <MenuItem Header="Search Both" Foreground="Black">
        <TextBox
            Name="SearchBothBox"
            Height="23"
            Width="120"/>
    

    下面是相关按键按下事件的代码:

    Private Sub SearchBothBox_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Input.KeyEventArgs) Handles SearchBothBox.KeyDown
        If e.Key = Key.Enter Then
            Dim SearchThread As New Thread(Sub() Search(Me.SearchBothBox.Text, 1))  <-- Exception occurs here when accessing SearcbhBothBox.Text
            SearchThread.Start()
        End If
    End Sub
    

    无论如何,我将使用调用来拉入字符串。

        Dim SearchString As String
        Me.Dispatcher.Invoke(New Action(Sub() SearchString = Me.SearchBothBox.Text))
    

    我仍然很困惑为什么我会在这个事件处理程序上得到这个异常,我想我应该检查一下是否有更好的方法来处理这种情况。

    1 回复  |  直到 10 年前
        1
  •  1
  •   Rohit Vats    10 年前

    在这一行:

    Dim SearchThread As New Thread(Sub() Search(Me.SearchBothBox.Text, 1))
    

    你是 试图访问UI线程以外的线程上的UI控件(TextBox.TextProperty)属性 。这就是问题所在。

    事件处理程序确实对UI线程进行了调用,但您已经从该线程启动了另一个线程,并尝试从那里访问UI属性。