J'ai une classe qui lira à partir d'Excel (C # et .Net 4) et dans cette classe, j'ai un travailleur en arrière-plan qui chargera les données d'Excel tandis que l'interface utilisateur peut rester réactive. Ma question est la suivante: est-ce une mauvaise conception d'avoir un travailleur en arrière-plan dans une classe? Dois-je créer ma classe sans elle et utiliser un travailleur en arrière-plan pour opérer sur cette classe? Je ne vois vraiment aucun problème de créer ma classe de cette façon, mais là encore, je suis un débutant, alors j'ai pensé que je m'assurerais avant de continuer.
J'espère que cette question est pertinente ici car je ne pense pas qu'elle devrait être sur stackoverflow pendant que mon code fonctionne, c'est juste un problème de conception.
Réponses:
Oui tu devrais. Et je vais vous dire pourquoi - vous violez le principe de responsabilité unique . En couplant étroitement la classe qui accède à la doc Excel avec la façon dont elle accède à la doc Excel, vous éliminez la possibilité pour le code "contrôleur" (tout code qui l'utilise) de le faire d'une manière différente. Comment différent, vous pouvez demander? Que se passe-t-il si le code du contrôleur comporte deux opérations qui prennent beaucoup de temps mais souhaitent qu'elles soient séquentielles? Si vous avez autorisé le contrôleur à gérer le threading, il peut effectuer les deux tâches de longue durée ensemble dans un seul thread. Que se passe-t-il si vous souhaitez accéder au document Excel à partir d'un contexte non UI et que vous n'avez pas besoin qu'il soit enfilé?
En transférant la responsabilité du filetage à l'appelant, vous permettez une plus grande flexibilité de votre code, le rendant plus réutilisable.
la source
C'est une bonne conception que les opérations d'interface utilisateur fonctionnent dans un thread séparé des tâches d'arrière-plan. Sinon, l'interface utilisateur ne répond plus lorsque l'application est occupée.
Si vous pouvez séparer la partie qui fonctionne dans le thread d'arrière-plan de sa propre classe, le code sera plus propre.
la source
Je séparerais votre interface utilisateur de votre tâche d'arrière-plan en utilisant des classes distinctes. Cela encourage la séparation des préoccupations. Le code d'interface utilisateur et la logique métier ne doivent pas être mélangés.
la source
D'après ce que je me souviens à propos de BackgroundWorkers, ils fournissent un certain nombre de méthodes pratiques comme la possibilité d'envoyer des mises à jour de progression à l'interface utilisateur. Il n'y a pas de règle qui dit que vous ne pouvez pas l'utiliser à partir d'une classe différente.
De plus, si vous effectuez une itération qui ne nécessite pas le traitement des éléments dans un ordre spécifique, envisagez d'utiliser le ThreadPool à la place (ou si vous êtes sur .NET 4, utilisez la bibliothèque parallèle de tâches ).
la source