Вопрос

Я думал, что Taskex.Whenall вернется, когда все задачи закончится, которая передается в течение метода. Так что ждут на Taskex.whanall вернется на массив возвратных операторов, так что когда каждый объект завершится, массив будет возвращен.

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

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

    }

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

Кто-нибудь может сказать мне, что именно природа Takex.whanall?

Это было полезно?

Решение

Вызов taskex.whanall встречается внутри цикла для цикла. Вы должны положить его на улицу.

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

    }

Другие советы

WhenAll() Создайте задачи, которые завершают, когда все дополнительные задачи завершены. Итак, сам метод не будет завершен, но задача будет.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top