Question

Dans mon application Web, il existe un processus qui interroge des données sur tout le Web, les filtre et les enregistre dans la base de données. Comme vous pouvez l’imaginer, ce processus prend du temps. Ma solution actuelle consiste à augmenter le délai d'expiration des pages et à donner une barre de progression AJAX à l'utilisateur pendant le chargement. Ceci est un problème pour deux raisons: 1) cela prend toujours trop de temps et l’utilisateur doit attendre 2) il arrive parfois que le délai soit écoulé.

J'ai essayé de suivre le processus et j'ai lu que je devrais le poster de manière asynchrone sur un service Web ("Lancez et oubliez").

Quelques références que j'ai lues:
- MSDN
- Tirer et oublier

Donc, ma question est la suivante: quelle est la meilleure méthode?

UPDATE: une fois que l'utilisateur a saisi ses données, je souhaite les rediriger vers la page de résultats qui est mise à jour de manière incrémentielle à mesure que le processus s'exécute en arrière-plan.

Était-ce utile?

La solution

Pour éviter l’astronomie excessive de l’architecture, j’ai souvent utilisez une iframe masquée pour appeler le processus de longue durée et retransmettre les informations de progression . Associé à quelque chose comme jsProgressBarHandler , vous pouvez créer assez facilement de superbes jeux hors bande. indication de progression pour les tâches plus longues lorsqu'une animation de progression générique ne la coupe pas.

Dans votre situation spécifique, vous pouvez utiliser un seul appel LongRunningProcess.aspx par tâche pour éviter les délais d'attente de page.

Par exemple, appelez LongRunningProcess.aspx? taskID = 1 pour le lancer, puis à la fin de cette tâche, émettez un

document.location = "LongRunningProcess.aspx?taskID=2".  

Ad nauseum.

Autres conseils

Nous avions un problème similaire que nous avons résolu en démarrant le travail via un appel de service Web asynchrone (ce qui signifiait que l'utilisateur n'était pas obligé d'attendre la fin du travail). Le service Web a ensuite démarré un travail SQL qui a effectué le travail et mis à jour périodiquement une table avec l'état du travail. Nous avons fourni une interface utilisateur permettant à l'utilisateur d'interroger la table.

J'ai rencontré ce problème lors de mon dernier emploi. Le meilleur moyen que j’ai trouvé était de lancer un processus asynchrone et d’avertir l’utilisateur lorsque cela est fait (courrier électronique ou autre). Les faire attendre si longtemps sera problématique à cause des délais d'attente et du gaspillage de productivité. Leur faire attendre une barre de progression peut leur donner un faux sentiment de sécurité: ils peuvent annuler le processus lorsqu'ils ferment le navigateur, ce qui peut ne pas être le cas, en fonction de la configuration du système.

  1. Comment interrogez-vous les données distantes?
  2. À quelle fréquence cela change-t-il?
  3. Les résultats peuvent-ils être mis en cache pendant un certain temps?
  4. Pendant combien de temps parlons-nous réellement ici?

La "meilleure méthode" dépendra probablement des réponses à ces questions ...

Vous pouvez créer un autre thread et stocker une référence au thread dans l'état de la session ou de l'application, selon que le thread ne peut s'exécuter qu'une fois par site Web ou une fois par session utilisateur.
Vous pouvez ensuite rediriger l'utilisateur vers une page où il peut surveiller la progression des threads. Vous pouvez configurer l'actualisation automatique de la page ou afficher un bouton d'actualisation à l'intention de l'utilisateur.
Une fois la discussion terminée, vous pouvez envoyer un courrier électronique à l'utilisateur.

Ma solution à ce problème est un service hors bande qui effectue ces opérations et les met en cache dans la base de données.

Lorsque la personne demande quelque chose la première fois, elle attend un peu, puis elle s'affiche, mais si elle est actualisée, c'est immédiat, puis, parce que c'est dans la base de données, cela fait maintenant partie de la mise à jour horaire. pour les prochaines 24 heures à partir de la dernière demande.

Ajoutez le travail, avec ses paramètres pertinents, à une table de file d'attente. Ensuite, écrivez un service Windows qui va récupérer ces travaux et les traiter, enregistrez les résultats dans un emplacement approprié et envoyez un e-mail au demandeur avec un lien vers les résultats. Il est également agréable de donner une sorte d’UI afin que l’utilisateur puisse vérifier l’état de son / ses travail (s).

Cette méthode est bien meilleure que de lancer un thread séparé ou d’augmenter le délai, en particulier si votre application est volumineuse et doit être mise à l’échelle, car vous pouvez simplement ajouter plusieurs serveurs pour traiter les travaux si nécessaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top