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

标签 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是被提示的对象。

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

最佳答案

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

易于修复,您需要将其冻结以使其成为线程安全的。将以下代码行添加到您的工作程序中:

    ...
    bmp2.EndInit()
    bmp2.Freeze();    // <== added

关于wpf - Backgroundworker-完成后无法使用生成的位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29819141/

相关文章:

C# WPF 订阅从 UserControl 激发的另一个类中的事件

c# - WPF : How can i show my login window(project imported) before my application window?

wpf - 在 WPF 中禁用鼠标点击显示忙/等待光标

java - 线程同步 - 打印到文件

Java参数,数组索引错误

java - 即使在调用中断方法后线程也不会中断

wpf - 半透明背景的文本框

VB.NET 单选按钮处理程序代码运行两次

vb.net - 从 AnyCPU 更改为 x86 会导致 System.BadImageFormatException 错误

VB.NET(或 C#)从现有列表创建字典而不循环