Mise à jour de mise à jour WPF dans un thread d'arrière-plan
J'ai un contrôle de ses données lié à un standard ObservableCollection
et j'ai une tâche de fond qui appelle un service pour obtenir plus de données.
Je veux, alors, de mettre à jour mes données de sauvegarde à l'arrière de mon contrôle, tout en affichant un "veuillez patienter" boîte de dialogue, mais quand j'ajoute de nouveaux éléments à la collection, le thread d'INTERFACE utilisateur verrouille alors qu'il re-lie et les mises à jour de mes contrôles.
Puis-je obtenir autour de cette sorte que mes animations et des trucs à garder en cours d'exécution sur mon "veuillez patienter" dialogue?
Ou au moins donner une "apparence" de l'utilisateur que ce n'est pas enfermé?
source d'informationauteur Mark
Vous devez vous connecter pour publier un commentaire.
Si je comprends bien, vous utilisez déjà un BackgroundWorker pour récupérer les données, et que tout simplement l'attribution de ces données à l'ObservableCollection est le verrouillage de l'INTERFACE utilisateur.
Une façon d'éviter le blocage de l'INTERFACE utilisateur est à céder les données à l'ObservableCollection en petits morceaux par des files d'attente de plusieurs répartiteur méthodes. Entre chaque appel de méthode, les événements de l'UI peut être manipulé.
suivants serait ajouter un élément à la fois, c'est un peu extrême, mais il illustre le concept.
ObservableCollection va augmenter CollectionChanged des événements qui auront la force de l'INTERFACE utilisateur de relier des données, de mesurer, de les organiser et de les redessiner. Cela peut prendre beaucoup de temps si vous avez beaucoup de mises à jour à venir.
Il est possible de faire l'utilisateur pense que l'INTERFACE utilisateur est vivant en divisant le travail en petits paquets. Utilisation Répartiteur de thread d'INTERFACE utilisateur (tout contrôle de référence a) de l'annexe de la collection mise à jour des actions avec 10-100 éléments (déterminer le nombre par expérience, ces juste pour soutenir l'idée).
Votre arrière-plan code pourrait ressemble à ceci:
utilisation BackgroundWorker pour accomplir cette tâche. mise à jour le obsrvablecollection dans DoWork méthode
J'ai une DLL qui gère un thread de travail et envoie les événements de l'application a fonctionné parfaitement sur windows forms, sont passés à WPF et tout s'est arrêté de travailler. J'ai été brisant ma tête contre un mur de briques de 4 heures à essayer d'obtenir que cela fonctionne. Mais la solution que j'ai terminé, merci à Microsoft de l'UI Thread-Safe de l'ordonnancement EnableCollectionSynchronization, donne vraiment propre mise en œuvre pour les résoudre.
Cette Collection s'étend ObservableCollection et met en œuvre EnableCollectionSynchronization faire de ces objets utilisables entre WPF et aussi arrière-plan travailleurs.
Modifier: Microsoft docs dire le suivant, donc je vais supposer que le contexte de l'objet de partage n'a pas d'importance.
ThreadSafeCollection.cs
Exemple WindowViewModel
WindowViewModel.cs
L'utilisation d'une liste dans une xaml/fenêtre de contrôle
MainWindow.xaml
Utiliser ceci: