2009-12-18 8 views
1

J'ai une page ASP.NET qui nécessite des données d'une autre DLL et le processus peut prendre beaucoup de temps. Donc, j'ai commencé à utiliser APM. Mais quand j'essaye ça, la page ne s'arrête jamais de charger. Il charge indéfiniment. Y a-t-il quelque chose que je fais de mal?Comment utiliser le modèle de programmation asynchrone dans ASP.NET?

Voici ma page web:

List<string> allVoices; 
GetAllVoicesDelegate getVoicesDelegate; 
internal delegate List<String> GetAllVoicesDelegate(); 

protected void Page_Load(object sender, EventArgs e) 
{ 
    Page.AddOnPreRenderCompleteAsync(new BeginEventHandler(BeginGetDropDownValues), 
     new EndEventHandler(EndGetDropDownValues)); 
} 

public IASyncResult BeginGetDropDownValues(object o,EventArgs args,AsyncCallback cb,object obj) 
{ 
    getVoicesDelegate = MyLib.getStrings; 
    return getVoicesDelegate.BeginInvoke(EndGetDropDownValues,null); 
} 

public void EndGetDropDownValues(IASyncResult ar) 
{ 
    allVoices = getVoicesDelegate.EndInvoke(ar); 
} 

protected override OnPreRenderComplete(EventArgs e) 
{ 
    if(allVoices.Count>0) 
    { 
    foreach(String str in allVoices) 
    { 
     Response.Write(str); 
    } 
    } 
    base.OnPreRenderComplete(e); 

} 

Voici la méthode MyLib.getStrings() dans une autre DLL:

public List<String> getStrings() 
{ 
    List<String> allStr=new List<string>(); 
    allStr.Add("1"); 
    allStr.Add("2"); 
    allStr.Add("3"); 
    allStr.Add("4"); 
} 

Répondre

1

Si vous devez obtenir des données à partir d'un processus de longue durée, effectuer des appels asynchrones à partir de la page Web ne vous aidera pas, car le processus doit finir avant que la page puisse terminer le rendu. Faire des appels asynchrones vous libère de faire d'autres choses en même temps, mais la page ne peut pas rendre jusqu'à ce que toute l'activité sur elle est terminée.

Je pense que vous devrez adopter une approche différente, soit en utilisant Ajax pour interroger le serveur jusqu'à ce que la réponse soit prête, soit en créant une page intermédiaire qui indique à l'utilisateur d'attendre la fin du processus. Une fois l'opération terminée, la page est actualisée et l'utilisateur voit les données.

0

Je ne suis pas trop au courant de votre approche de l'informatique asynchrone asp.net (j'utilise généralement ajax pour faire des demandes aux services web, etc.)

Un défaut possible, de mon point de vue, est le gestionnaire OnPreRenderComplete. Ce gestionnaire n'est pas asynchrone au meilleur de ma connaissance. Il est utilisé pour gérer l'événement de quand tous les contrôles de page sont en cours de chargement et prêts.

The OnPreRenderComplete method is called when the prerendering stage of the page life cycle is complete. At this stage of the page life cycle, all controls are created and the page is ready to render the output.

Dans ce gestionnaire d'événements, vous faites référence à allVoices membre de niveau de classe qui est traitée par les gestionnaires async. Est-il possible alors le code dans ce gestionnaire doit attendre le délégué asynchrone pour terminer? (Essentiellement en vain l'objectif d'async).

Encore une fois juste une supposition. Que se passe-t-il si vous supprimez le gestionnaire `OnPreRenderComplete '? ou commentez le code à l'intérieur?

En outre - Je pense que l'article que vous avez référencé est un peu dépassé et peut ne pas s'appliquer au développement d'applications Web? Généralement, la programmation asynchrone sur le web se fait via AJAX et/ou les services Web/WCF?

+0

thx 4 réponse, kevin. après avoir retiré le gestionnaire OnPreRenderComplete, j'ai toujours le même problème. – Attilah

+0

Désolé, cela ne vous a pas aidé. Je les autres réponses vous conduisent dans la bonne direction. Le code sur lequel vous basez la solution est destiné à Winforms je pense. Vous aurez besoin de regarder AJAX et/ou webservices pour faire la programmation d'applications web asynchrones. –

0

Votre problème est probablement la compilation de votre page ASP.NET (en général, cela prend quelques secondes), et non le chargement de la dll (en général, cela ne prend que quelques millisecondes).

0

L'exemple de code que vous avez fourni lance certains travaux sur un thread distinct et permet au processus de travail asp.net de continuer à traiter votre demande de page sans bloquer votre tâche longue. Si la tâche longue dure longtemps, votre page prendra beaucoup de temps à afficher. Commencez par remplacer le début par une sorte de code mocké pour retourner une facture. Si votre page se termine presque immédiatement, alors votre câblage asynchrone est correct et vous devrez probablement passer à une approche d'interrogation qui utilise la première requête pour démarrer la tâche et rendre une page "Nous traitons votre requête" à l'utilisateur. Cette page utilise ensuite ajax pour interroger le système pour un type d'indicateur d'achèvement, une fois qu'il est reçu, l'utilisateur est redirigé vers la page de résultats et les résultats sont affichés.

Questions connexes