0

Je suis en difficulté lors de l'utilisation de l'arrière-plan pour créer mon modèle d'objet.Comment puis-je créer un contrôle générique à partir d'un thread de backgroundWorker?

Comme je comprends pourquoi, je suis incapable de trouver une solution de contournement.

Voici la logique pseudo:

  • Appel Webservice async

  • Lors de la réception, ouvrez un travailleur de fond, et les données de charge dans les commandes en arrière-plan

  • dans la méthode de charge , recherchez un objet existant et s'il n'est pas trouvé, créez-en un nouveau.

Tous les objets créés hérite de contrôle (avec une couche transparente résumé).

Alors que je crée des contrôles sur le thread principal, la fonction beau travail:

public static T Find<T>(ObservableCollection<T> collection, int objectId) 
     where T : FormaliteBaseControl, new() 
    { 
     foreach (T item in collection) 
     { 
      if (item.ObjectId == objectId) 
       return item; 
     } 

     return new T(); 
    } 

Bien sûr, lorsqu'il est appelé à partir du fil de fond, une exception fil croix se produit au « nouveau T() » Dans Silverlight , il n'y a aucun moyen d'appeler Dispatcher.Invoke de manière synchrone.

Et pendant que je crée environ 450 objets de cette façon, je voudrais garder la création du modèle objet en arrière-plan sans diminuer les performances avec Thread.Sleep ou d'autres méthodes "géniales".

Merci pour vos réponses.

+0

Dans quel type de conteneur les 450 commandes d'interface sont-elles placées? Un ItemsControl ou ListBox? Quelque chose qui est virtualisé? – WiredPrairie

+0

Étant donné que vous utilisez un thread, vous pouvez rencontrer des problèmes avec la collection que vous utilisez également - si vous modifiez la collection à partir d'un autre thread (alors qu'un autre thread utilise un énumérateur, via foreach). – WiredPrairie

Répondre

0

Créez-vous des contrôles d'interface utilisateur réels? C'est ce que je sous-entends. Si tel est le cas, il ne semble pas logique de déléguer cela à un fil de discussion. Pourquoi? Beacuse sont en fin de compte des objets d'interface utilisateur, ils doivent donc être créés sur le thread de l'interface utilisateur. Je sais que vous êtes préoccupé par le blocage, mais tout votre travail principal doit être ramené à l'interface utilisateur.

Probablement le meilleur cas pour cela sera de fournir un pub/sous-modèle. Vous pouvez générer le thread qui a la logique dans le thread d'arrière-plan, mais il n'instanciera jamais un objet. Au lieu de cela, il publiera la demande. Sur le fil de l'interface utilisateur, vous écoutez et créez les objets. Les extensions réactives (Rx) seraient particulièrement utiles car vous pouvez convertir ObservableCollection en observable puis rassembler les itérations dans l'interface utilisateur.

0

Merci à vous deux.

Mes contrôles génèrent une vue arborescente. En réalité, un objet racine contient 4 expandeurs, qui ont un itemscontrol en tant qu'enfant (contient 45 objets). Chacun de ces objets enfants a un autre expandeur avec un contrôle d'items, ayant environ 10 enfants.

@WPCoder: Comme ItemsControl contient rarement plus de 10 objets et très rarement 45, et parce que les éléments peuvent avoir plusieurs hauteur et de l'enfant, la virtualisation did'nt me aider (oui, je l'ai essayé)

Après quelques essais, je vois que c'est l'étape du gabarit qui prend cette fois. Ma déclaration d'objet tient dans une seconde. J'ai donc utilisé une solution de contournement pour garder les premiers objets profonds réduits lorsque le modèle d'objet devient trop grand. Les utilisateurs gardent la possibilité de forcer l'expansion au démarrage en tant que paramètre, mais ils connaissent l'envers de cette méthode.

@Jeremy, je suppose que le MVVM est la meilleure solution pour implémenter votre solution? Je vais lire pour les extensions réactives. Merci.

Questions connexes