WPF调度程序/线程问题

时间:2010-03-24 09:08:23

标签: wpf multithreading

我的代码存在问题,根本无法修复。

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'类型的未处理异常

附加信息:调用线程无法访问此对象,因为其他线程拥有它。“

由于

2 个答案:

答案 0 :(得分:2)

如前所述,BitmapImage只能在创建它的线程中使用。

如果加载许多小尺寸图像,则可以在后台线程中将图像加载到MemoryStream。在内存中有数据后,切换到UI线程并设置StreamSource:

image.StreamSource = new MemoryStream(data);

答案 1 :(得分:1)

DispatcherObject降序的对象具有线程关联性。这意味着除了创建对象的线程之外的任何线程都无法访问(大多数)其属性和方法。

BitmapImage来自哪里?谁创建它以及在哪个线程上?

如果你解释一下你想要实现的目标,我认为你所做的事情可能会更简单。