Je veux mettre en œuvre une telle logique dans mon application ASP-NET-MVC:
L'autre jour, j'ai vu un article qui a expliqué pourquoi créer de nouvelles Les threads de l'application ASP-NET sont fortement non recommandés et Threadpool est celui qui doit être utilisé.
Quelles sont les meilleures pratiques pour MVC dans ce cas? Pourquoi ne devrait-il pas créer mon threads, mes travaux d'affaires, des tâches, quoi que ce soit par moi-même et utilisez ThreadPool? L'application sera hébergée sur un serveur public, si cela compte. P> p> utilisateur clique sur un bouton CODE> -> P> Server exécute un certain temps. logique dans ~ 15 threads (je reçois des données de sources indépendantes vraiment lentes) code> -> p>
5 Réponses :
Parce qu'un threadpool est conçu pour le faire: P>
Il fournit un pool de fils pouvant être utilisés pour exécuter des tâches, poster des éléments de travail, traiter des E / S asynchrones, attendre au nom d'autres threads et les minuteries de processus. P> blockQuote>
Je suppose qu'il est préférable de stocker les résultats sur votre serveur dans une base de données quand ils sont effectués. P>
Et ensuite, vous pouvez utiliser une minuterie et un ajax pour demander périodiquement si le processus est effectué, si oui, obtenez des données. P>
Vous ne devriez pas créer vos propres threads car cela a des frais généraux importants. Créer un nouveau fil est cher. La question devrait donc être: pourquoi ne devriez-vous pas utiliser le threadpool? Il a un certain nombre de discussions prêtes à être utilisées. Une approche encore meilleure serait d'utiliser la bibliothèque parallèle de la tâche, elle fournit une couche d'abstraction au-dessus de la threadpool qui le rend beaucoup plus facile à travailler avec des threads. P>
Vous devez vous rendre compte que le seul moyen (facile) d'accomplir cela est d'attendre l'utilisateur jusqu'à ce que tout travail soit effectué, puis servant la page. Une approche plus compliquée mais aussi plus réactive serait d'utiliser Ajax (via JQuery par exemple) pour demander au serveur à quel point le travail a progressé. De cette façon, vous pouvez également fournir un indicateur de progression. P>
Ce serait une opération effectuée par admin / modérateur, de sorte que ce n'est pas si nécessaire :)
Oui JQuery et certains Ajax le feront le plus correctement. Chargez la page, puis envoyez ~ 15 requêtes AJAX distinctes sur le serveur et laissez-les finir de manière asynchrone. De cette façon, vous pouvez laisser le filetage du serveur Web (qui est bien) et se concentre sur l'affichage d'un ticker ou d'une barre de progression virtuelle à l'utilisateur en attendant. P>
Tant que le travail peut être décomposé de cette façon, c'est une très bonne approche ... En plus d'éviter les pièges de rouler vos propres threads, il est beaucoup plus facile de donner les commentaires de l'utilisateur au fur et à mesure.
Qu'il s'agisse d'une bonne approche dépend de la fusion des résultats sur le serveur ou sur le client. Le risque existe que vous devez déplacer beaucoup de logique au client qui pourrait être mieux traité sur le serveur.
Cela semble être un correctif facile au début, cependant, si votre client a la même URL s'ouvrir dans différents onglets, vous remarquerez très rapidement les limitations sur les connexions ouvertes à un seul domaine par navigateur. (Quelque chose que beaucoup de gens découvrent maintenant avec WebSockets) Vous avez également été réduit au nombre de demandes que votre serveur peut gérer à 1 / 15ème par rapport à ce que Jim Leonardo a proposé. La réponse de Rohan Singh est moins complexe et seulement légèrement moins évolutive que Jim's
Si vous utilisez .NET 4, je recommanderais même à regarder les espaces de noms parallèles. Ils rendent cela encore plus simple et font un meilleur travail d'utilisation de tous vos cœurs de la CPU. P>
Je regarderais également le déchargement de votre application Web principale. Avoir un ensemble séparé de services ou une file d'attente de message pour gérer cette requête de longue date vous permettra d'accabler beaucoup plus facilement et permettra à votre application Web de s'inquiéter des demandes de page d'entretien, sans effectuer une longue logique de fonctionnement. Google quelque chose comme "Demande de course longue de l'IIS" pour commencer. P>
Ceci semble être un très bon endroit pour utiliser le nouveau Vous pouvez voir dans le code d'origine qu'ils interrogent à chaque source de manière séquentielle, mais dans la version finale, toutes les tâches Exécuter en parallèle et contrôle des retours au contrôleur quand ils sont tous remplis: p> asyccontroller code> dans asp.net mvc 2. Il est vraiment facile à utiliser et vous permet d'exécuter des requêtes contre plusieurs sources indépendantes sans bloquer les threads de la requête. < p> MSDN a un excellent exemple a> où ils interrogent un service de presse, un service météo et un service de sport. p>
Bon sang, une URL devrait être une promesse, en particulier dans quelque chose comme la documentation. Aussi ennuyeux que l'URL n'a changé que de manière triviale (ajoute »(vs = V.100)» sans raison évidente). Quoi qu'il en soit, merci de le pointer, @pandawood. Corrigé maintenant.
Ceci est maintenant obsolète, car les contrôleurs MVC 4+ comprennent des fonctionnalités asynchronisées. Voici un exemple: ASP.net/ MVC / Vue d'ensemble / Performance / ...