2009-10-06 4 views
0

J'ai donc cette interface qui est juste un gros bouton GO qui synchronise un tas de données d'un outil à l'autre. Le problème est qu'il prend un temps très long et certains utilisateurs se demandent quel est le problème. Je me demande donc s'il y a un moyen de mettre quelque chose dans ma boucle, de sorte que chaque fois qu'il y a tant d'entrées, cela renvoie quelque chose à la page pour les mettre à jour sur la progression.Comment obtenir des commentaires sur une page à partir d'un thread en cours d'exécution dans ASP.NET?

Actuellement, il s'agit juste d'une page .aspx avec un aspx.cs derrière elle. Le bouton Go déclenche l'ensemble du processus et appelle Response.Write une tonne de fois (en plus d'écrire la même chose dans un fichier journal que j'ai fait) mais les réponses ne s'affichent que lorsque tout est terminé.

Veuillez nous aviser.

Répondre

0

Je suppose que vous appelez une autre classe pour faire le travail. Appelons cela le WorkerClass

Vous pouvez faire en sorte que l'événement WorkerClass soit associé à un événement, que la page .aspx se connecte également et qu'il écrive un message lorsque l'événement est déclenché.

// Overload EventArgs to send messageas back up 
public delegate void UpdateMethod(object sender, EventArgs e); 

public class WorkerClass 
{ 
    public event UpdateMethod UpdateMethod; 
} 

WorkerClass worker = new WorkerClass(); 

worker.UpdateMethod += new UpdateMethod(worker_UpdateMethod); 

EDIT basé sur le commentaire, il est là-bas la page

Si vous ne voulez pas factoriser à une autre classe de faire le travail (que je suggère). Vous pouvez poster les messages de cette façon.

protected override void Render(HtmlTextWriter writer) 
{ 
    base.Render(writer); 

    this.ProcessMassiveWorkLoad(); 
} 

private void ProcessMassiveWorkLoad() 
{ 
    for(int i = 0; i < 100000; i++) 
    { 
     // Do some work 

     // Write the fact you have work 
     Response.Write(string.Format("Done {0} of 100000", i); 
    } 
} 
+0

La méthode faisant le travail est juste une méthode que j'ai ajoutée à ma classe de page. – BigOmega

+0

Je refactoriser à une autre classe. –

2

Vous pouvez concevoir une classe qui sera stockée dans la session et qui représentera l'état actuel de l'opération:

public class OperationState 
{ 
    public object Result { get; set; } 
    public int Progress { get; set; } 
    public string Error { get; set; } 
} 

Une instance de cette classe pourrait être créée lorsque vous démarrez l'opération et stockez-le dans la session de l'utilisateur. Ensuite, à chaque étape de l'opération, vous pouvez l'extraire de la session et mettre à jour la propriété progress. Une fois l'opération terminée, vous pouvez définir la propriété Result ou la propriété Error en cas d'exception. En attendant, vous pouvez concevoir un PageMethod qui sera accessible depuis le script client. Cette méthode retournera simplement l'instance d'état de la session. Vous l'invoquerez ensuite périodiquement et de manière asynchrone à partir de javascript pour vérifier la progression et mettre à jour le DOM pour informer l'utilisateur.

0

La manière la plus simple de résoudre votre problème est d'appeler le Response.Flush() après chaque Response.Write.

Ceci va vider le tampon de réponse en cours vers le client, lui permettant de voir l'état actuel de la page.

Même méthode David's aurait besoin de cela pour obtenir les réponses à l'utilisateur en temps opportun. La meilleure solution serait le long des lignes de Darin's solution, ce qui impliquerait certains scripts côté client de (disons) un panneau de mise à jour, que vous actualiser avec un temporisateur JavaScript pour obtenir l'état le plus récent, mais qui peut introduire d'autres problèmes pour vous (avoir besoin de JavaScript allumé, réécrire la méthode longue course comme quelque chose que vous pouvez déclencher de manière asynchrone, etc).

Si c'est une consolation, j'ai fait les deux dans le passé, et j'utiliserais à nouveau.

Questions connexes