2015-12-07 154 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 –