【发布时间】:2011-05-04 01:12:10
【问题描述】:
我正在使用线程从网站获取图像并将其拍摄回父表单 (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() 在它自己的线程上运行。如果我使用位图对象(我可以在窗口窗体中与 PictureBox 一起使用),一切都会很好。也就是调试这段代码,当我到了那一行
Bitmap bitmap = bmp;
并检查变量 bmp,一切都很好并且按预期工作。但是,当我到达下一行时
BitmapImage bitmapImage = bmpImg;
并检查变量 bmpImage,我得到大量 System.InvalidOperationException。当这在实践中并被分配给 WPF Image 对象时,它会说“调用线程无法访问此对象,因为不同的线程拥有它。”为什么我在 WPF BitmapImages(设置 ImageSource 所必需的)中遇到此问题,但在 Windows 窗体 Bitmap 对象(可用于设置 PictureBox)中却没有?如何在 WPF 中解决此问题?
【问题讨论】:
标签: wpf multithreading imagesource