Est-ce qu'une page ASP.NET faire partie de son traitement après la fin du chargement de la page?

StackOverflow https://stackoverflow.com/questions/1179666

  •  19-09-2019
  •  | 
  •  

Question

J'ai une page ASP.NET qui prend trop de temps à charger. Un peu de tests montre que les côté serveur l'enregistrement prend un morceau juste de temps et (parce que l'utilisateur ne doit jamais voir les résultats de l'exploitation forestière) Je veux retarder jusqu'à ce que la page chargée.

Y at-il un moyen simple de le faire?

Je l'ai essayé de le placer dans l'événement Disposed de la page, mais cela ne semble pas tirer et en cas de Unload mais trop tôt les incendies. Je préfère ne pas avoir à frayer un fil mais je pourrais peut-être si c'est ce qu'il faut.

Je suis pas à la recherche d'AJAX. Je veux faire une charge pleine page normale, puis après la page est chargée (vu du côté client) faire un peu plus de traitement.

Était-ce utile?

La solution

Cela semble fonctionner:

protected void Page_Unload(object sender, EventArgs e)
{
    HttpContext.Current.Response.Flush();
    HttpContext.Current.Response.Close();
    Thread.Sleep(20000); // Do processing here instead of sleeping :)
    Debug.WriteLine("Done!");
}

Vous avez mentionné l'événement se déclenche Décharger trop tôt, mais il me semble que c'est juste à temps. Vous avez juste besoin de fermer la connexion manuellement. Flushing semble être obligatoire aussi bien, ce qui est un peu étrange, comme je pensais une chasse d'eau était implicite lorsque vous fermez.

Il pourrait y avoir quelques inconvénients à cela, car il maintient le processus de traitement de la demande occupé, incapable de traiter la requête HTTP suivante. IIS7 a une limite configurable sur le nombre de demandes simultanées cependant. Vous vouliez simple, je pense que cela est aussi simple que ça ira.

Autres conseils

Avez-vous envisagé la création d'un service d'enregistrement qui prend une file d'attente de messages pour vous connecter et effectue simplement l'enregistrement dans son propre thread?

Avec cela, vous pouvez laisser toute l'exploitation forestière de se produire où ils étaient dans le code avant et juste faire des appels asynchrones aux méthodes d'exploitation.

Vous êtes à la recherche d'un processus asynchrone. AJAX permet aussi bien que d'autres mises en œuvre. Effectuez une recherche pour Async et ASP.Net et vous trouverez une tonne de ressources.

En gros votre page Web démarre et exécute les processus dans un thread séparé alors que l'interface utilisateur continue à rendre.

Essayez d'appeler affleurant sur le flux de réponse avant de vous connecter. Décharger ne se déclenche qu'après l'envoi de la réponse entière. Si vous flush () là-bas et puis ouvrez une session, il devrait être la dernière chose que la page fait.

L'effet doit être que l'utilisateur voit la page, mais qu'il ne soit pas terminé le chargement jusqu'à ce que le journal se fait. Mais ils peuvent interagir avec la page, probablement ils ne se préoccuperont pas.

Ceci est possible avec des fils asynchrones. Nous avons créé une page pour un client qui vérifie toutes les 2 minutes s'il y a une mise à jour et si oui nous avons mis à la page.

Peut-être que ce guide pratique vous aidera à:

http://www.eggheadcafe.com/articles/20060918.asp

espoir pourrait vous aider

Au lieu de vous connecter dans votre journal, faire une chaîne de (à l'aide StringBuilder) et vers la fin, appuyez sur cette chaîne entière dans le journal.

Vous pourriez perdre l'enregistrement, si la page ne se charge pas en raison d'une exception.
Pardonnez-moi, si je ne l'ai pas compris correctement le problème.

Quel genre de l'exploitation forestière est et où ça va?

Une façon peut être d'essaimer un autre thread (vous aurez besoin d'augmenter la quantité de threads disponibles à asp.net) et effectuer l'enregistrement là-dedans. Vous pouvez utiliser le ParameterizedThreadStart et passer un objet à utiliser pour l'exploitation forestière. (Ne pas passer une connexion de base de données / objet de commande si, ce serait mauvais!)

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