Parfois, l'utilisateur démarre une opération technique étendue qui prend un certain temps à exécuter. Dans ces cas, il est généralement agréable d'afficher une sorte de barre de progression, ainsi que des informations sur la tâche en cours d'exécution.
Afin d'éviter de coupler étroitement l'interface utilisateur et les couches logiques, il est généralement préférable que la communication se fasse via une sorte de proxy. Autrement dit, le back-end ne doit pas manipuler ses propres éléments d'interface utilisateur, ni même interagir directement avec la couche intermédiaire.
De toute évidence, il doit y avoir un rappel quelque part pour que cela fonctionne. Je l'ai généralement implémenté de deux manières:
Passez un objet modifiable au back-end et demandez-lui de le modifier au fur et à mesure. L'objet avertit le serveur frontal lorsqu'un changement se produit.
Passez une fonction de rappel du formulaire
void f(ProgressObject)
ouProgressObject -> unit
que le back-end invoque. Dans ce cas, le back-end construit leProgressObject
et il est complètement passif. Il doit construire un nouvel objet à chaque fois qu'il veut rendre compte des progrès, je suppose.
Quels sont les inconvénients et les avantages de ces méthodes? Existe-t-il une meilleure méthode convenue à utiliser? Y a-t-il des circonstances différentes pour leur utilisation?
Y a-t-il des techniques complètement différentes pour signaler les progrès que j'ai ignorées?
BackgroundWorker
ce RH mentionne. Enveloppé dans une classe personnalisée avec un "formulaire de progression", etc. et un mécanisme simple pour communiquer une exception - comme BackgroundWorker
par conception s'exécute dans un thread séparé. Dans la mesure où nous utilisons ses fonctionnalités d'une manière suggérée par .Net, cela pourrait être considéré comme idiomatique. Et dans n'importe quel contexte de langage / cadre donné, "idiomatique" peut être le meilleur.