2009-02-09 8 views
2

J'ai une forme avec deux panneaux (haut, bas), chaque panneau contient des grilles. Fondamentalement, c'est un formulaire maître-détail où la sélection d'une ligne de la grille supérieure afficherait des détails dans la grille du bas.Gardez UI Thread free

La liaison des données à la grille de détail prend un certain temps. Étant donné que la liaison est effectuée sur le thread d'interface utilisateur, il bloque le thread et, par conséquent, l'utilisateur ne peut pas sélectionner une autre ligne de la grille principale tant que la liaison n'est pas terminée.

Veuillez noter qu'en liant, je ne veux pas dire obtenir des données de la source de données. C'est la liaison réelle qui prend plus de temps car elle nécessite beaucoup de données. Comment puis-je garder le thread de l'interface utilisateur libre pendant que la grille de détail fait sa liaison?

Merci mille fois.

+0

Garry: I "m déjà fait BeginUpdate et EndUpdate – Sheraz

Répondre

0

Finalement, j'ai trouvé la solution. La solution n'inclut pas le multithreading pour commencer. Comme je l'ai dit que le retard était de lier la grille ce qui signifie que le fil principal a été tenu, nous ne pouvions pas faire grand-chose. Donc, la solution est d'apporter des retards. Lorsque l'utilisateur sélectionne la ligne principale, une minuterie cochée pendant un certain temps. Si une autre demande est faite avant l'expiration du délai, le minuteur est redémarré. C'est nous ignorons tous les appels qui sont faits parce que l'utilisateur cliquait ou sélectionnait des lignes trop rapidement. Une fois la minuterie expirée, je prends la ligne sélectionnée et affiche les données. Solution simple et élégante.

1

Vous ne pouvez pas. La mise à jour de l'interface utilisateur doit être effectuée sur le thread UI.

Vous pouvez accélérer la liaison en utilisant des commandes telles que BeginUpdate/EndUpdate, disponibles sur certaines commandes, mais comme vous ne spécifiez pas ce que vous utilisez, je ne peux pas dire si c'est disponible.

+0

Garry, Il est grille Infragistics – Sheraz

+0

Et je" m appeler déjà BeginUpdate et EndUpdate – Sheraz

0

Vous pouvez utiliser un fil d'arrière-plan pour effectuer la récupération des données, puis utiliser le fil d'interface utilisateur pour l'afficher.

+0

J'ai eu l'impression qu'il faisait déjà ce –

+0

ck: comme je l'ai dit, le retard est ne récupérant pas les données mais liant les données à la grille, le thread BackGround ne sert à rien. – Sheraz

+0

Ensuite, soit vous liez beaucoup trop de données, ou vous avez une machine très lente :) – cjk

0

Si j'étais vous, il semble que vous avez affaire à BEAUCOUP de données, et je séparerais tout le "massage" que vous pouvez en un processus de fil séparé. Par exemple, lors de la création d'une fiche, vous pouvez "manuellement" extraire manuellement les données de détail d'un thread d'arrière-plan vers un autre ensemble de données et effectuer le massage, puis lier l'ensemble de données résultant à la grille. De cette façon, la seule chose qui se passe sur le thread de l'interface utilisateur est juste la liaison de l'interface utilisateur. En fin de compte, si cela prend trop de temps, vous risquez d'approcher un point critique de votre application où vous devez faire manuellement ce que vous devez faire dans le code plutôt que d'utiliser les fonctionnalités de liaison de données prêtes à l'emploi dans .NET.

+0

routeNpingme: Vous avez dit "la façon dont la seule chose qui se passe sur le thread de l'interface utilisateur est juste la liaison de l'interface utilisateur". Ma question consistait essentiellement à souligner le problème que pose le dalay lorsque je suis lié, pas quand je reçois des données. – Sheraz

+0

Mon commentaire provient de l'endroit où vous avez dit que vous massiez les données - en supposant que cela se passe dans une forme quelconque d'événement _DataBinding? Ou est-ce que je me trompe? – Brandon

+0

Fondamentalement, la grille doit formater les données (nombres, devises, etc.) et lorsque nous lions les données, elle fait tout cela. Dès que je mets la source à la grille (grid.DataSource = valeur), il tient le thread pendant 2-3 secondes. Pendant cette période, l'écran est gelé. J'espère que j'ai expliqué en détail cette fois. Merci – Sheraz