mises à jour d'observable de fonction de filetage dans .NET
Travailler avec ObservableCollection
objets et threads d'arrière-plan conduit souvent à des exceptions si des modifications sont tentées à l'extérieur du thread d'interface utilisateur. Cet article explique pourquoi et fournit une solution.
Le défi: nature unique
Les ObservableCollection
S sont intrinsèquement monomoroliques. Ils ne peuvent être modifiés que à partir du fil qui les a créés (généralement le fil d'interface utilisateur). Tenter des mises à jour d'un fil de travail entraîne une exception.
Solution pour .net 4.5 et ultérieure
.NET 4.5 et versions ultérieures proposent BindingOperations.EnableCollectionSynchronization
pour l'accès à filetage. Cette méthode gère les événements de synchronisation et de répartition CollectionChanged
au thread d'interface utilisateur.
Étapes d'implémentation:
sur le thread UI: Appelez BindingOperations.EnableCollectionSynchronization(yourObservableCollection, new object())
. Le deuxième argument est un objet de verrouillage; L'utilisation de new object()
crée un verrou simple.
dans le thread de l'emplois: Utilisez l'objet même Lock transmis à EnableCollectionSynchronization
. Acquérir le verrou avant de modifier le ObservableCollection
et le libérer par la suite. Cela garantit la sécurité des fils.
Effectuez des mises à jour: apportez vos modifications au ObservableCollection
pendant que la serrure est maintenue.
Cette approche exploite la synchronisation intégrée du cadre, fournissant une solution propre et efficace pour mettre à jour ObservableCollection
s à partir des threads d'arrière-plan. N'oubliez pas de toujours libérer la serrure pour éviter les blocs de non-blocs.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!