如何等待任务完成Task.WhenAll?

时间:2015-12-07 16:10:19

标签: c# multithreading async-await task

到目前为止这一切都有效,但有两件事让我感到困扰,我认为我使用的是错误的方式

问题#1 - 我只想返回一个字符串,但我似乎被迫返回一个字符串ARRAY。我怎样才能让这个返回一个字符串?

   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 个答案:

答案 0 :(得分:7)

您只有一个Task,因此您可以直接await。您不需要Task.WhenAll

string userEmail = await GetVelocifyData();

Task.WhenAll方法

  

创建一个任务,该任务将在可枚举集合中的所有System.Threading.Tasks.Task对象完成时完成。

完成后,任务将返回一个数组,其中包含传递给Task.WhenAll的所有任务的结果。