2010-03-24 5 views
0

J'ai un problème dans mon code et je ne suis pas en mesure de le réparer.Problème de répartiteur/filetage WPF

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); 
    } 

qui est appelé comme ceci:

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); 
     } 

Il se bloque toujours sur cette ligne: img.Source = bi; L'erreur est: « Une exception non gérée du type « System.InvalidOperationException » a eu lieu dans WindowsBase.dll

Informations complémentaires: Le thread appelant ne peut pas accéder à cet objet parce qu'un autre thread est propriétaire. »

Merci

Répondre

2

comme déjà mentionné BitmapImage peut être utilisé uniquement dans le thread où il a été créé.

Si vous chargez plusieurs images de petite taille, vous pouvez charger des images dans MemoryStream dans le fil d'arrière-plan. Une fois que vous avez des données en mémoire, passez en thread UI et définissez StreamSource:

image.StreamSource = new MemoryStream (data);

1

Les objets descendants de DispatcherObject ont une affinité de fil. Cela signifie que (la plupart) de leurs propriétés et méthodes ne sont pas accessibles à partir de n'importe quel thread en dehors du thread sur lequel l'objet a été créé. Où vient le BitmapImage? Qui le crée et sur quel fil?

Je pense que ce que vous essayez de faire peut probablement être beaucoup plus simple si vous expliquez ce que vous essayez d'atteindre.

+0

Merci pour la réponse. Le bitmapImage vient d'ici: private bitmapImage GetBitmapObject (int nPos) { return parameters.ListBitmaps [nPos]; } J'essaie de charger des fichiers bitmap à partir du disque et de les ajouter à une grille. J'ai besoin de le faire dans un fil afin que je puisse mettre à jour une fenêtre d'état pendant le chargement des images. – phm