【问题标题】:Passing Objects as Arguments to Dispatcher.Invoke in WPF将对象作为参数传递给 WPF 中的 Dispatcher.Invoke
【发布时间】:2014-07-16 21:11:05
【问题描述】:

我在新线程中创建了一个 BitmapImage 变量,需要作为 Dispatcher.BeginInvokeArgument 传递给 UI 线程

但发生错误:

调用目标抛出异常

在 mscorlib.dll 中发生“System.Reflection.TargetInvocationException”类型的未处理异常

这是我的代码:

Public Delegate Sub NewDeleSub(ByVal InputImage As BitmapImage)
Private MyThread As Thread


Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded

    MyThread = New Thread(AddressOf NewThread)
    MyThread.SetApartmentState(ApartmentState.STA)
    MyThread.Start()

End Sub

Private Sub NewThread()

    Dim InImage As New BitmapImage(New Uri("Image Path"))
    Me.Dispatcher.BeginInvoke(New NewDeleSub(AddressOf RotateImage), InImage)

End Sub

Private Sub RotateImage(ByVal Img As BitmapImage)

    Dim OurImg As New Image
    OurImg.Source = Img

End Sub

在这些行中发生了错误:

Private Sub RotateImage(ByVal Img As BitmapImage)

    Dim OurImg As New Image
    OurImg.Source = Img

End Sub

【问题讨论】:

  • 错误是异常被调用的目标抛出
  • String & Integers 可以作为参数传递给 Dispatcher.Invoke,但对象变量不能。如何发送对象?
  • 为什么认为object不能通过?不要从你的问题中得出这个结论。我猜您在RotateImage 方法中有更多代码?因为只有这两行代码,我认为这里没有任何异常,OurImg 只是一个新控件,甚至没有设置任何父控件。
  • 问题是发送BitmapImage对象到子RotateImage后,发生错误。
  • 抛出异常的确切行是什么?如果尝试注释掉该行(甚至RotateImage 中的所有代码)会怎样?

标签: wpf vb.net invoke dispatcher


【解决方案1】:

终于,我找到了答案。它只需要使用InImage.Freez 就可以在线程之间发送。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 2012-02-27
    • 2017-06-04
    • 1970-01-01
    相关资源
    最近更新 更多