Backgroundworker - 完成后无法使用生成的位图

时间:2015-04-23 09:23:43

标签: wpf vb.net multithreading parameter-passing backgroundworker

您好我在处理完成后将我在BackgroundWorker的DoWork处理程序中生成的图像数据分配给图像对象时遇到问题。我收到一个错误,指出"调用线程无法访问此对象,因为另一个线程拥有它"。错误行是

PreviewImage.Source = Bmp

我的DoWork处理程序代码如下:

Private Sub QueryForAssociatedData(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BW_DrawSideBarImage.DoWork
        Using Context As New MyContext
            Try
                Dim bmp2 As New BitmapImage
                bmp2.BeginInit()
                bmp2.StreamSource = New MemoryStream(SidebarImageBytes)
                bmp2.EndInit()

                'Dispatcher.Invoke(Sub() PreviewImage.Source = bmp2)

                e.Result = bmp2
            Catch ex As Exception

            End Try
        End Using
    End Sub

我希望能够以通常的方式在RunWorkerCompleted中公开创建的图像,但它似乎不起作用:

    Private Sub FinishDrawingSidebar(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BW_DrawSideBarImage.RunWorkerCompleted
        Dim Bmp As BitmapImage = TryCast(e.Result, BitmapImage)
        PreviewImage.Source = Bmp
    End Sub

我也试过

Dispatcher.Invoke(Sub() PreviewImage.Source = Bmp)

在DoWork和RunWorkerCompleted中但出现相同的错误。如果我只返回Nothing而不是Bmp那么没有问题所以我假设Bmp是被抱怨的对象。

请让我知道我做错了什么愚蠢的事。谢谢!

1 个答案:

答案 0 :(得分:4)

只要BitmapImage仍然可以修改,它就会与创建它的线程保持关联。在另一个线程中使用它将抛出你得到的异常。

简单的修复,你需要冻结它,以便它变得线程安全。将这行代码添加到您的工作人员:

QLineEdit