ASP.NET MVC Multithreading
Je veux mettre en œuvre une telle logique dans mes asp net mvc de l'application:
user clicks a button
->
server executes some time-consuming logic in ~15 threads (i get data from really slow independent sources)
->
when all work is done, server merges the results and passes it back to user
L'autre jour j'ai vu un article qui expliquait pourquoi créer de nouvelles discussions en asp-net application n'est pas fortement recommandé, et le pool de threads est celui qui doit être utilisé.
Quelles sont les meilleures pratiques pour mvc dans ce cas? Pourquoi ne devrais pas, je créer mon fils, backgroundworkers, les tâches, que ce soit, par moi-même et de l'utilisation de pool de threads? L'Application sera hébergée sur un serveur public, si il le faut.
Vous devez vous connecter pour publier un commentaire.
Si vous êtes en utilisant .Net 4, je dirais même recommandons de regarder le parallèle espaces de noms. Ils font même plus simple et de faire un meilleur travail en utilisant tous vos cœurs.
Je voudrais aussi regarder le déchargement de votre web app complètement. Ayant un ensemble de services ou d'un message de la file d'attente pour gérer cette demande longue vous permettra d'échelle beaucoup plus facilement et permettra à votre web app à vous soucier de l'entretien de demandes de page, de ne pas effectuer de longues exécution de la logique. Google quelque chose comme "iis long de l'exécution de la demande" pour obtenir commencé.
Cela semble être un très bon endroit pour l'utilisation de la nouvelle
AsycController
dans ASP.NET MVC 2. Il est vraiment facile à utiliser et vous permet d'exécuter des requêtes sur plusieurs sources indépendantes, sans demande de blocage des threads.MSDN est un excellent exemple où ils sont de l'interrogation d'une news service, un service de météo, et un service des sports.
Vous pouvez le voir dans le code d'origine qu'ils sont d'interrogation de chaque source de façon séquentielle, mais dans la version finale, toutes les tâches s'exécutent en parallèle et le contrôle retourne au contrôleur quand ils sont tous terminés:
Oui JQuery et AJAX va le faire le plus correctement.
Chargement de la Page, puis de l'envoyer ~15 séparé Ajax de requêtes vers le Serveur et de les laisser finir de manière asynchrone. De cette façon, vous pouvez les laisser sur le serveur web poignée de thread (qui est bien) et de se concentrer sur l'affichage soit un texte ou un virtuel barre de progression à l'utilisateur en attente.
Parce qu'un pool de threads est conçu pour le faire:
Je pense qu'il est préférable de stocker les résultats sur votre serveur dans une base de données lorsqu'ils sont effectués.
Et puis vous pouvez utiliser une minuterie et d'AJAX pour demander régulièrement si le processus est terminé, si oui, obtenir les données.
Vous ne devriez pas créer votre propre fils parce que cela a une surcharge importante. La création d'un nouveau thread est cher. Donc, la question devrait être: pourquoi ne devriez-vous pas utiliser le pool de threads? Il a un certain nombre de fils prêt à l'emploi. Une meilleure approche serait d'utiliser la task parallel library, il fournit une couche d'abstraction au-dessus du pool de threads qui le rend beaucoup plus facile de travailler avec les threads.
Vous devez comprendre que le seul moyen (facile) pour ce faire, il faut avoir à l'utilisateur d'attendre jusqu'à ce que tout le travail est fait et ensuite servir de la page. Un peu plus complexe mais aussi plus réactif approche serait d'utiliser Ajax (via jQuery par exemple) pour demander au serveur périodiquement dans quelle mesure le travail a progressé. De cette façon, vous pouvez également fournir un indicateur de progrès.