2015-12-07 151 views
1

這一切工作,到目前爲止,但有兩件事情打擾我,我想我使用了錯誤的方式如何等待任務完成Task.WhenAll?

問題#1 - 我只是想返回一個字符串,但我似乎被迫返回一個字符串數組。我怎麼才能讓這個返回一個字符串?

Task<string> taskVelocifyData = GetVelocifyData(); 
      string[] userEmail = await Task.WhenAll(taskVelocifyData); 

問題#2 - 不知道這是一個問題,但是這是最佳的等待異步任務纔去到下一個異步任務完成?

private async void DispatcherTimer_Tick(object sender, object e) 
    { 
     List<string>[] photos = new List<string>[10]; 

     try 
     { 
      //Use Velocify API to get most recent lead 
      Task<string> taskVelocifyData = GetVelocifyData(); 
      string[] userEmail = await Task.WhenAll(taskVelocifyData); 

      //Ignore recent lead if it has not changed 
      if (lsi.VelocifyLeadTitle != previousVelocifyLeadTitle) 
      { 
       //If there is an email, use FullContact API to get photos 
       if (userEmail[0] != "") 
       { 
        var taskFullContactData = GetFullContactData(userEmail[0]); 
        photos = await Task.WhenAll(taskFullContactData); 

        if (photos.Count() != 0) 
        { 
         var taskFaceData = GetFaceData(photos); 
        } 

       } 
       else 
       { 
        lsi.FullContactPictures = new ObservableCollection<string>(); 
       } 

       // DEBUG 
       // dispatcherTimer.Stop(); 

       LeadSpeakerItems.Add(lsi); 

       SpeakData(leadSpeakerItems.Last().VelocifyLeadTitle); 
      } 

      previousVelocifyLeadTitle = lsi.VelocifyLeadTitle; 
     } 
     catch (Exception ex) 
     { 

     } 
+1

爲什麼不使用'Task.WhenAny()'或直接等待一個任務?如果你只想等待一個任務然後等待它。 – Fabjan

回答

7

你有一個Task,這樣你就可以直接await它。你不需要Task.WhenAll

string userEmail = await GetVelocifyData(); 

Task.WhenAll方法

創建一個任務,當所有可枚舉集合在System.Threading.Tasks.Task對象已經完成,將完成。

完成後,該任務將返回一個數組,其所有任務的結果將傳遞給Task.WhenAll

+0

我會補充一點,'Task.WhenAll'意味着任務數組不是單個任務的答案。 – toadflakz

+0

@toadflakz我剛剛添加它。很慢,因爲我正在吃晚飯 –

+0

@Jakub你爲什麼在晚餐時回答問題? :X –