错误:调用线程无法访问此对象,因为拥有它的是另一个线程。

3

我遇到了这个错误,以下是代码:

    Image image;
    BitmapImage BmpImg;
    MemoryStream ms;

    public void Convert()
    {
        ms = new MemoryStream();
        image.Save(ms, ImageFormat.Jpeg);

        BmpImg = new BitmapImage();
        BmpImg.BeginInit();
        BmpImg.StreamSource = new MemoryStream(ms.ToArray());
        BmpImg.EndInit();
    }

    private void Btn_Click(object sender, RoutedEventArgs e)
    {     
        Dispatcher.Invoke(new Action(() => { Image.Source = BmpImg; }));
    }

如何将 System.Drawing.Image 转换为 BitmapImage 并显示在 WPF 上?

1
不要在除了UI线程之外的线程上执行此操作。 - user1228
另外,您不必创建另一个内存流,只需执行 ms.Position = 0; 即可重复使用现有的流。 - Luaan
1个回答

7

BmpImg是在后台线程上创建的。 您不能绑定到在UI线程之外的线程上创建的 Image Source DP 对象。

由于您正在使用 Dispatcher ,因此我假设您现在知道如何委派UI线程上的事情。

所以您需要做的就是通过Dispatcher将 BmpImg 的创建也放在UI线程上。

您也可以像这样获取UI调度程序 - App.Current.Dispatcher

或者

如@Clemens在评论中建议的那样,如果在BitmapImage实例上调用 Freeze(),则可以跨线程访问它。

BmpImg.Freeze()

5
不完全正确。在调用BmpImg.Freeze()之后,它才能起作用。 - Clemens
是的,它会生效,但是由于 OP 没有在其上调用 Freeze,所以我建议这样做,但是确实我会在答案中更新。谢谢! - Rohit Vats

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接