2010-11-13 6 views
1

Je pensais que TaskEx.WhenAll reviendrait lorsque toutes les tâches terminées seront passées dans la méthode. Donc attendez sur TaskEx.WhenAll retournera le tableau des instructions de retour, de sorte que lorsque chaque objet aura fini, le tableau sera retourné.Qu'est-ce que `TaskEx.WhenAll` dans le CTP Async?

Mais ce n'est pas le cas. Quand je fais:

public async Task AsynchronousCallServerMordernParallelAsync() 
    { 

     List<Task<string>> lstTasks = new List<Task<string>>(); 

     StringBuilder builder = new StringBuilder(); 

     for (int i = 2; i <= 10; i++) 
     { 
      using (WebClient client = new WebClient()) 
      { 
       try 
       { 
        this.tbStatus.Text = string.Format("Calling Server [{0}]..... ", i); 
        string currentCall = string.Format(Feed, i); 
        Task<string> task = client.DownloadStringTaskAsync(new Uri(currentCall)); 
        lstTasks.Add(task); 

       } 
       catch (Exception ex) 
       { 
        this.tbStatus.Text = string.Format("Error Occurred -- {0} for call :{1}, Trying next", ex.Message, i); 
       } 
      } 

      string[] rss = await TaskEx.WhenAll<string>(lstTasks); 
      foreach(string s in rss) 
       builder.Append(s); 

      MessageBox.Show(string.Format("Downloaded Successfully!!! Total Size : {0} chars.", builder.Length)); 
     } 

    } 

Je vois mon MessageBox apparaît plus d'une fois, et attendre également les étapes avec tableau de 1 élément, puis tableau d'élément 2 et ainsi de suite.

Quelqu'un peut-il me dire quelle est exactement la nature de TakEx.WhenAll?

Répondre

3

L'appel à TaskEx.WhenAll se produit à l'intérieur de la boucle for. Vous devez le mettre dehors.

public static async Task AsynchronousCallServerMordernParallelAsync() 
    { 
     List<Task<string>> lstTasks = new List<Task<string>>(); 

     StringBuilder builder = new StringBuilder(); 

     for (int i = 2; i <= 10; i++) 
     { 
      using (WebClient client = new WebClient()) 
      { 
       try 
       { 
        Console.WriteLine("Calling server..."); 
        Task<string> task = client.DownloadStringTaskAsync(new Uri("http://www.msn.com")); 
        lstTasks.Add(task); 

       } 
       catch (Exception ex) 
       { 
        Console.WriteLine("Error occurred!"); 
       } 
      } 

     } 

     string[] rss = await TaskEx.WhenAll<string>(lstTasks); 
     foreach (string s in rss) 
      builder.Append(s); 

     Console.WriteLine("Downloaded!"); 

    } 
+0

Ohh .. J'ai eu le problème ... Super! Merci .. J'ai juste négligé. – abhishek

2

WhenAll() crée une tâche qui se termine lorsque toutes les sous-tâches sont terminées. Ainsi, la méthode elle-même ne sera pas complète, mais la tâche sera.

Il s'agit d'une méthode qui crée une nouvelle tâche qui agrège la tâche distincte en une nouvelle tâche plus grande.

+0

Je sais que de la documentation, mais le problème est, si je mets attendre juste avant la TaskEx.WhenAll, il retourne le tableau après chaque tâche dans la liste est terminée. Est-ce un bug? – abhishek

+0

Je reçois actuellement le MesssageBox plus d'une fois, donc même si toutes les tâches ne sont pas terminées, il obtient le tableau de chaînes pour moi. – abhishek

+1

Ah, je vois maintenant. Vous devez déplacer l'appel 'WhenAll' et toutes les lignes après cela en dehors de votre boucle' for'. Essayez cela et voyez si ça aide. –

Questions connexes