【问题标题】:Odd WPF Cross-Thread Issue奇怪的 WPF 跨线程问题
【发布时间】:2014-08-11 16:56:52
【问题描述】:

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

我知道,当尝试从另一个线程访问 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))

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

【问题讨论】:

  • 查看 DispatcherTimer。
  • Dim SearchThread As New Thread 不会创建一个新线程吗?访问 that 线程上的文本框是您遇到异常的原因。
  • 何必呢?在启动线程之前阅读文本框要容易得多。还要查看 ThreadPool、Tasks 等。结果如何不受欢迎?
  • @HenkHolterman 我确实经常使用 taks,但在这种情况下,我只是使用线程来选择数据网格中的一行 - 我宁愿不检查它是否已完成或返回完全没有,所以我不想使用任务。

标签: wpf vb.net eventhandler


【解决方案1】:

在这一行:

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

试图访问 UI 线程以外的线程上的 UI 控件 (TextBox.TextProperty) 属性。于是就有了问题。

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

【讨论】:

  • 啊,当然。我自己应该注意到的。我一直认为 sub 是在新线程上运行的,不一定是启动 sub 在新线程上运行的命令。我必须记住这一点。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 2011-03-04
  • 2010-12-25
相关资源
最近更新 更多