我的代码存在问题,根本无法修复。
private static void SetupImages(object o)
{
int i = (int)o;
BitmapImage bi = GetBitmapObject(i);
img = new System.Windows.Controls.Image();//declared as static outside
img.Source = bi;//crash here
img.Stretch = Stretch.Uniform;
img.Margin = new Thickness(5, 5, 5, 5);
}
这样称呼:
for (int i = 0; i < parameters.ListBitmaps.Count; i++)
{
ParameterizedThreadStart ts = new ParameterizedThreadStart(SetupImages);
Thread t = new Thread(ts);
t.SetApartmentState(ApartmentState.STA);
t.Start(i);
t.Join();
//SetupImages(i);
parameters.ListImageControls.Add(img);
}
它总是在这一行崩溃:img.Source = bi; 错误是: “WindowsBase.dll中发生了'System.InvalidOperationException'类型的未处理异常
附加信息:调用线程无法访问此对象,因为其他线程拥有它。“
由于
答案 0 :(得分:2)
如前所述,BitmapImage只能在创建它的线程中使用。
如果加载许多小尺寸图像,则可以在后台线程中将图像加载到MemoryStream。在内存中有数据后,切换到UI线程并设置StreamSource:
image.StreamSource = new MemoryStream(data);
答案 1 :(得分:1)
从DispatcherObject
降序的对象具有线程关联性。这意味着除了创建对象的线程之外的任何线程都无法访问(大多数)其属性和方法。
BitmapImage
来自哪里?谁创建它以及在哪个线程上?
如果你解释一下你想要实现的目标,我认为你所做的事情可能会更简单。