Donnez votre avis

Asp.net : tester l'avancement d'un traitement serveur depuis le client

Posez votre question

hello, voila un code que j'ai eu à implémenter pour faire patienter un poste client lors d'un traitement serveur relativement long.


Principe général


durant l’exécution d'un traitement coûteux en temps, le serveur va générer des balises
qu’il va envoyer au client grâce à l’instruction Response.Flush()

Flush() sert à vider et envoyer le contenu du tampon de sortie au client.


Une  fonction javascript implémentée au niveau client va se servir du nombre de
généré pour connaître l’avancement du traitement serveur.
Le code javascript est généré lui aussi depuis le code behind.
 
 
// code behind


using System.Threading;

private string * tab = new string []{"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"};

private void Page_Load(object sender, System.EventArgs e)
  {
   Response.Write("
");
   Response.Write("_");
   Response.Write("
");
   Response.Write("<script>mydiv.innerText = '';</script>");
   Response.Write("<script language=javascript>");
   Response.Write("function ShowWait(){");
   Response.Write("mydiv.innerText = 'Traitement effectué : ';");
// on recupere le nombre de div généré sur le poste client et on affiche en pourcentage l'avancement du traitement
// serveur, cette ligne est à adapter suivant ce que l'on veut afficher.
   Response.Write("mydiv.innerText +=  parseInt(parseInt(document.getElementsByTagName(\"div\").length-1)/"+ tab.Length + "*100);");
   Response.Write("mydiv.innerText += ' %';}");
   Response.Write("function StartShowWait(){mydiv.style.visibility = 'visible'; window.setInterval('ShowWait()',1000);}");
   Response.Write("function HideWait(){mydiv.style.visibility = 'hidden';window.clearInterval();}");
   Response.Write("StartShowWait();</script>");
   Response.Flush();
   
   traitementGourmand();

  }
  
  private void traitementGourmand()
  {
 
   for (int i = 0;i<tab.Length;i++)
   {    
     // on positionne les div àl'endroit ou l'on veut "flagger" l'avancement du traitementserveur
     Response.Write("

");
     Response.Flush();
           // simule un traitement long              
     Thread.Sleep(1000);
   }
   Response.Write("fin traitement");
  }
 
Code client
 
A coller dans la balise head. Cette fonction permet d'effacer l'affichage de l'avancement du traitement serveur une fois que ce dernier est réalisé.
 
<script>
   HideWait();
</script>

Voila j'espère avoir été suffisamment clair.

Adresse d'origine
Ajouter un commentaire

Commentaires

Commenter la réponse de SuperBouly