Si j'ai besoin de générer un ensemble de données assez volumineux à l'aide de LINQ, cela peut prendre un certain temps (disons quelques secondes) et je dois) générer un retour à l'utilisation de% 'âge fait, y a-t-il un moyen facile/préféré de le faire?Comment signaler une progression lors de l'exécution d'une expression LINQ sur un ensemble de données volumineux
exemple, dire que j'ai la liste A avec 1000 voitures et la liste B avec 1000 camions et je veux sélectionner toutes les paires possibles commandé (voiture, camion) où car.color == lien truck.color ceci:
var pairs = from car in A
from truck in B
where car.color==truck.color
select new {car, truck};
Maintenant, à un moment donné, cela sera évalué comme un ensemble de boucles foreach imbriquées. Je voudrais être en mesure de signaler% 'âge complet pendant qu'il interagit et idéalement mettre à jour une barre de progression ou quelque chose.
EDIT: Juste après ma requête, je stocke le résultat dans une variable membre comme une telle liste (qui force la requête à exécuter):
mPairs = pairs.ToList();
Je le fais parce que je suis exécutais cela dans un thread de travail d'arrière-plan car je ne veux pas que le thread de l'interface utilisateur se fige car il évalue l'expression LINQ à la demande sur le thread UI (c'est dans Silverlight BTW). C'est pourquoi je voudrais signaler les progrès. L'UX est essentiellement ceci:
- Un utilisateur fait glisser un élément sur l'espace de travail
- Le moteur démarre alors sur un fil d'arrière-plan pour déterminer les (nombreuses) possibilités de connexion à tous les autres éléments de l'espace de travail.
- Pendant que le moteur calcule l'interface utilisateur n'autorise pas les nouvelles connexions ET les rapports indiquent si le nouvel élément sera "connectable" aux autres éléments (tous les chemins de connexion possibles non utilisés ont été déterminés via LINQ).
- Lorsque le moteur termine le calcul (requête), l'élément est connectable dans l'interface utilisateur et les chemins de connexion possibles sont stockés dans une variable locale pour une utilisation ultérieure (par exemple, lorsque l'utilisateur clique pour connecter l'élément en fonction de ce mis en évidence a été calculé quand il a été ajouté)
(un processus similaire doit se produire sur la suppression d'un article)
J'aime vraiment cette approche. Mon expression LINQ se compose de plusieurs imbriqués - je pourrais mettre ceci autour de la liste la plus externe pour au moins obtenir un indicateur de progression brut (qui est probablement tout ce dont j'ai besoin de toute façon car je ne veux pas trop payer de mise à jour). – caryden