gpt4 book ai didi

wpf - 使用WPF图像进行线程处理(System.InvalidOperationException)

转载 作者:行者123 更新时间:2023-12-03 13:17:57 25 4
gpt4 key购买 nike

我正在使用线程从网站获取图像并将其拍摄回父表单(WPF)进行显示。我遇到了一个问题,并设法将其调试为以下示例:

public void Watch()
{
while (true)
{
Bitmap bmp = new Bitmap(1, 1);
BitmapImage bmpImg = new BitmapImage();

this.SetImage(bmp, bmpImg);
}
}

public delegate void SetImageCallback(Bitmap bmp, BitmapImage bmpImg);

private void SetImage(Bitmap bmp, BitmapImage bmpImg)
{
if (!this.imgVideo.Dispatcher.CheckAccess())
{
SetImageCallback del = new SetImageCallback(SetImage);
this.Dispatcher.Invoke(del, bmp, bmpImg);
}
else
{
Bitmap bitmap = bmp;
BitmapImage bitmapImage = bmpImg;
}
}

请记住,Watch()在其自己的线程上运行。如果我使用位图对象(可以在Window Forms中与PictureBox一起使用),则一切正常。也就是说,当我进入代码行时,调试此代码
Bitmap bitmap = bmp;

并检查变量bmp,一切都很好,并且按预期工作。但是,当我到达下一行时
BitmapImage bitmapImage = bmpImg;

并检查变量bmpImage,我得到了大量的System.InvalidOperationException。实际上,当将其分配给WPF Image对象时,它说:“调用线程无法访问此对象,因为另一个线程拥有它。”为什么我会遇到WPF BitmapImages(设置ImageSource所需)而不是Windows Forms Bitmap对象(可用于设置PictureBox)的问题?如何在WPF中解决此问题?

最佳答案

WPF中的大多数对象都属于此类:它们不能在不同线程之间共享。但是,某些低级资源(例如画笔和位图)是从称为Freezable的特殊类派生的,如果该类冻结了,则可以在不同线程之间共享。当然,一旦冻结了对象,就无法再进行任何修改。要冻结可冻结对象,只需调用Freeze,这将防止跨线程异常。

关于wpf - 使用WPF图像进行线程处理(System.InvalidOperationException),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5877447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com