De façon asynchrone en ajoutant à ObservableCollection (ou une alternative)
Voici ce que j'ai
- une zone de liste avec un ItemsSource ensemble à un ObservableCollection<T>
- où T est ma classe personnalisée représentant un dossier, contenant seulement 2 DependencyProperties: nom de fichier et ThumbnailPath.
- La zone de liste dispose également d'un DataTemplate personnalisé défini, afin de bien afficher une image et un nom de fichier sous.
Le but de la zone de liste est pour afficher des fichiers vidéo dans le dossier actif (sélectionné dans un TreeView), avec des vignettes (générés de façon asynchrone; ne fait pas partie de ce problème).
Alors quand j'ai changer le dossier dans l'Arborescence, l'ObservableCollection est nettoyé et rempli de nouveau, ce qui se reflète automatiquement dans la zone de liste des éléments.
Voici le problème: L'INTERFACE utilisateur ne répond plus, et il faut plusieurs secondes pour mettre à jour. Encore une fois, les vignettes n'ont pas d'importance ici (j'ai essayé de les désactiver).
Je pense que ce qui prend le plus de temps est la construction de 50 à 100 cas de ma classe personnalisée, et leur représentation visuelle - elle a pour initialiser une Image de l'objet pour chacun d'eux. Mais c'est juste mon avis - pourriez-vous confirmer ou d'exclure la possibilité?
Je commence à penser ObservableCollection peut pas la voie à suivre ici, car à partir de ce que j'ai lu et un peu de ce que j'ai essayé, il n'y a pas moyen d'ajouter des éléments de manière asynchrone, au moins si ces éléments sont DependencyObjects. J'ai essayé de créer mon instances de classe avec un BackgroundWorker et les ajouter à la collection dans le ProgressChanged gestionnaire d'événements, mais il déclenche une exception (certains filetage vs dependencyobjects problème).
Il y a une chose que je suis absent? Ou serais-je mieux de simplement abandonner ObservableCollection et l'écriture d'un bon vieux asynchrone en boucle pour ajouter des éléments?
"Le doit créer DependencySource sur le même Thread que l'DependencyObject"
Qu'en est
Binding, IsAsync = True
?OriginalL'auteur oli.G | 2012-10-14
Vous devez vous connecter pour publier un commentaire.
Depuis votre
ObservableCollection
est lié à l'INTERFACE utilisateur par conséquent, il est généré sur le thread de l'INTERFACE utilisateur de sorte que toute les autres mises à jour (ajouter/supprimer/effacer) doivent être sur le même thread d'INTERFACE utilisateur. Il ne permet pas les mises à jour à partir d'un autre thread.Cependant, ce que vous pouvez faire est de créer insance de votre classe (ou de tous les temps de l'opération sur le thread d'arrière-plan) et une fois que vous avez terminé, ajouter l'objet dans ObservableCollection à l'aide de
Dispatcher
de votre thread de l'INTERFACE utilisateur, ceCe Répartiteur faire est de mettre de l'opération sur son associée fil. Par conséquent, l'article sera toujours ajouté sur le thread de l'INTERFACE utilisateur, mais peuvent être créés dans le thread d'arrière-plan.
Voici quelques liens qui pourraient vous aider à aller - La mise à jour à partir de BW et d'autres un ici
Oui ta DP doivent être créés sur le thread de l'INTERFACE utilisateur lui-même. Dans le cas où vous souhaitez lier à votre INTERFACE utilisateur, vous devez utiliser du DP mais dans le cas où pas, je vous suggère d'aller pour la simple
POCO
propriétés de mise en œuvre deINPC
interface.Je ne veux lier... j'ai besoin de la liste pour afficher une liste de mes FICHIER des instances de classe, avec mes datatemplate personnalisé appliqué. Je pense que je vais aller avec l'INPC.
OriginalL'auteur Rohit Vats
Avec .net 4.5, vous pouvez utiliser EnableCollectionSynchronization
OriginalL'auteur Andreas