Диспетчер WPF / проблема с потоками - PullRequest
0 голосов
/ 24 марта 2010

У меня проблема с кодом, и я не могу ее исправить.

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; Ошибка: «Произошло необработанное исключение типа« System.InvalidOperationException »в WindowsBase.dll

Дополнительная информация: вызывающий поток не может получить доступ к этому объекту, так как он принадлежит другому потоку. "

Спасибо

Ответы [ 2 ]

2 голосов
/ 24 марта 2010

как уже упоминалось, BitmapImage может использоваться только в потоке, в котором он был создан.

Если вы загружаете много изображений небольшого размера, вы можете загрузить изображения в MemoryStream в фоновом потоке. Когда у вас есть данные в памяти, переключитесь на поток пользовательского интерфейса и установите StreamSource:

image.StreamSource = new MemoryStream (данные);

1 голос
/ 24 марта 2010

Объекты, происходящие из DispatcherObject, имеют сходство потоков. Это означает, что (к большинству) их свойств и методов нельзя получить доступ ни из одного потока, кроме потока, в котором был создан объект.

Откуда взялся BitmapImage? Кто это создает и на каком потоке?

Я думаю, что то, что вы пытаетесь сделать, возможно, будет гораздо проще, если вы объясните, чего именно вы пытаетесь достичь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...