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()
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.