2009-12-22 5 views
0

Je ne pouvais pas trouver un moyen d'afficher une page s'il vous plaît attendre tout en faisant une opération asynchrone; Ce que j'essaie de mettre en œuvre est une page de recherche qui affiche l'animation «please wait» pendant que l'opération de recherche est effectuée par un thread asynchrone.Opérations async MVC futures

Je colle le code de test simple I implémenté ci-dessous. La vue initiale "Recherche" n'est jamais affichée même si le débogueur passe par cette ligne. Je ne vois que la vue 'Résultats' finale une fois l'opération terminée;

public class HomeController : AsyncController 
{  
     public ActionResult Search() 
     { 
      // Add an asynchronous operation 
      AsyncManager.OutstandingOperations.Increment(); 
      ThreadPool.QueueUserWorkItem(o => 
      { 
       Thread.Sleep(5000); 
       AsyncManager.OutstandingOperations.Decrement(); 
      }, null); 

      return View("Searching"); 
     } 

     public ActionResult SearchCompleted() { 

      return View("Results"); 
     } 
} 

Répondre

0

En fait, vous n'avez pas besoin d'un appel asynchrone car vous voulez attendre la fin du processus. Utilisez des méthodes asynchrones lorsque vous ne voulez pas attendre le résultat.

Tout ce dont vous avez besoin est un div caché sur votre page avec le texte "Recherche".

  1. Mark Recherche en action [POST] et publiez votre formulaire à cette action
  2. Utilisez javascript pour afficher la "Recherche" div lorsque la page est affichée.

$ ("# recherche"). Show();
$ ("formulaire"). Submit();

Lorsque le processus se termine, accédez à la vue des résultats.

C'est tout.


Si vous voulez toujours faire appel à un siège d'action async: http://msdn.microsoft.com/en-us/library/ee728598(VS.100).aspx#performing_multiple_operations_in_parallel

0

Ceci est une application Web, vous ne pouvez pas faire cela du serveur au client. Vous devrez implémenter quelque chose avec ajax. Je vais vous donner la base pour le faire, si vous voulez un exemple de code faites le moi savoir.

1) La partie inférieure "Search" doit appeler une fonction js qui affiche le message "Please Wait".
2) La même fonction js doit appeler la méthode serveur qui fait la recherche (avec ajax). Ici, je recommande d'utiliser JQuery, il a une méthode appelée ajax qui est très simple à utiliser.
3) Effectuez la recherche dans la méthode serveur et renvoyez le résultat au format html ou xml ou json.
4) Sur la méthode de rappel js, cachez le message "Please wait" et affichez le résultat de la recherche.

0

méthodes Async exécutées sur le serveur, et non le client. Vous utiliseriez un contrôleur asynchrone si, par exemple, vous souhaitez appeler plusieurs services Web pour obtenir des données pour votre page. Vous pouvez mettre des requêtes en file d'attente à tous, elles seront exécutées en parallèle et à la fin, asp.net les rassemblera pour terminer l'assemblage de votre page.

Dans votre scénario, vous effectuez déjà une requête partielle à partir d'une page terminée et n'avez pas vraiment besoin d'un contrôleur asynchrone. Si vous ne trouvez pas que vos requêtes sont mises en file d'attente, j'éviterais cette complexité supplémentaire.