2010-01-27 4 views
4

J'ai une base de données avec une table qui enregistre des données provenant de diverses sources. 3 colonnesLiaison de données WPF avec haute fréquence

'Source' 'Value' 'Timestamp'

par exemple

source1 21 '11: 03'

source6 22 '11: 03'

source9 456 '11: 03'

La table est mise à jour deux à trois fois par seconde. Chaque valeur peut ou non changer. Chaque valeur 'Source' est affichée dans une étiquette séparée ou une zone de texte sur l'écran (pas dans une grille). J'ai besoin de trouver la meilleure méthode pour que ces données se lient aux contrôles WPF. Quel type d'objet dois-je conserver les données dans Dictionary, DataTable, etc.

Quel type d'objet va contenir les données? Comment lier mon Label ou TextBox à la valeur.

Je interroge les sources 2 à 4 fois par seconde. La grande majorité du temps les valeurs dans la table de base de données ne changera pas Souvent, c'est seulement une valeur qui change Parfois, ils changent tous Je m'attends seulement à avoir environ 30 sources de données uniques.

Mettez vos casquettes de pensée sur s'il vous plaît.

Répondre

2

Juste par hasard, je suis confronté à un problème très similaire. Comme moi, je suppose que vous mettez à jour les données dans un fil de fond.

Collections

Utilisez MTObservableCollection au lieu de ObservableCollection pour stocker les données. Un ObservableCollection est normalement utilisé pour la liaison de données sur des éléments qui peuvent changer, mais il ne peut pas être mis à jour à partir d'un thread d'arrière-plan. MTObservableCollection fonctionne pour moi, mais il ne s'agit pas d'un thread sans danger, alors soyez prudent.

http://www.julmar.com/blog/mark/2009/04/01/AddingToAnObservableCollectionFromABackgroundThread.aspx

modèles

Chaque objet doit mettre en œuvre INotifyPropertyChanged Interface. Cela leur permettra de prendre en charge la liaison de données. En outre, WPF vous permet de mettre à jour les propriétés de cette manière sur les threads en arrière-plan.

http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

Préférez plus claire et mise à jour Ajouter

Assurez-vous de toujours mettre à jour des objets quand vous le pouvez. Ne pas simplement effacer la collection et le recharger, cela sera très coûteux et provoquer des effets indésirables de l'interface utilisateur. Bien sûr, vous pouvez faire des ajouts individuels et les supprimer au besoin.

1

Je ne suis pas exactement clair sur ce point, mais il semble que la table est mis à jour 2 à 4 fois par seconde. Est-ce correct? Si tel est le cas, la configuration d'un thread pour interroger la table et mettre à jour une collection d'objets en mémoire qui déclenchent un événement lors de la mise à jour semble être une approche raisonnable. Si vous avez implémenté ces objets, INotifyPropertyChanged vous pouvez vous lier directement aux propriétés des objets, puis, lorsqu'ils sont mis à jour en arrière-plan, l'interface utilisateur sera mise à jour de façon automatique (attention à la gestion des threads, bien sûr).

+0

À moins que vous faites quelque chose des éléments spéciaux, d'ajouter ou de retirer de la collection entière provoquera une exception. –

+0

@Johnathan - Pourquoi ajouter et supprimer des objets? Je pense que les mettre à jour sur place est plus raisonnable, si l'hypothèse de mise à jour par rapport aux données ajoutées tient. – codekaizen

+0

Oui, par tous les moyens de mise à jour lorsque cela est possible. Mais que se passe-t-il si votre requête renvoie 10 lignes maintenant et 11 lignes la prochaine fois? –

0

Option 2 - Files d'attente du message

Au lieu de mettre à jour les collections sur un fil d'arrière-plan, il suffit de créer vos deltas (liste des modifications). Pompez ces modifications dans votre thread graphique en utilisant Dispatcher.BeginInvoke avec un niveau de priorité faible, peut-être Background ou ContextIdle.

Une fois que le répartiteur a détecté vos modifications, il les exécute sur votre thread graphique. Cela vous permet d'éviter toutes les implications de threading méchant. Et en modifiant le niveau de priorité, vous pouvez le régler pour la vitesse de mise à jour par rapport à la réactivité de l'utilisateur.

Encore une fois, assurez-vous d'utiliser les mises à jour plutôt que de les supprimer et de les remplacer.

0

Je serais intéressé de savoir si les extensions réactives pourraient vous aider dans cette situation. Avec eux, au lieu de "tirer" des données dans votre formulaire, les données peuvent être "poussés" à partir de la source de l'événement pour mettre à jour vos contrôles. Juste une pensée. J'espère que c'est utile, ou du moins intéressant!

Questions connexes