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 <DIV> qu'il va envoyer au client grâce à l'instruction Response.Flush()
Response.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 <div> 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("<div id='mydiv' >");
Response.Write("_");
Response.Write("</div>");
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("<div style='display:none'></div>");
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.