Что такое `TaskEx.WhenAll` в Async CTP? - PullRequest
1 голос
/ 14 ноября 2010

Я думал, что TaskEx.WhenAll вернется, когда все задачи будут завершены, что передается в методе. Поэтому await для TaskEx.WhenAll будет возвращать массив операторов Return, так что, когда каждый объект будет завершен, массив будет возвращен.

Но это не так. Когда я делаю:

    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));
        }

    }

Я вижу, что мой MessageBox появляется несколько раз, а также ожидаю шагов с массивом из 1 элемента, затем с массивом из 2 элементов и так далее

Может кто-нибудь сказать мне, какова природа TakEx. Когда все?

Ответы [ 2 ]

3 голосов
/ 14 ноября 2010

Вызов TaskEx.WhenAll происходит внутри цикла for.Вы должны положить его на улицу.

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!");

    }
2 голосов
/ 14 ноября 2010

WhenAll() создать задачу, которая завершается после завершения всех подзадач.Таким образом, сам метод не будет завершен, но задача будет выполнена.

Это метод, который создает новую задачу, которая объединяет отдельную задачу в новую более крупную задачу.

...