Pregunta

TaskEx.WhenAll pensé que volvería cuando todas las tareas se haya terminado que se pasa dentro del método. Así esperan en TaskEx.WhenAll devolvería el conjunto de sentencias de retorno, de manera que cuando todos los objetos que se haya terminado, se devolverá la matriz.

Pero no es así. Cuando hago:

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

    }

Veo mi cuadro de mensaje aparece más de una vez, y también medidas esperan en la gama de 1 elemento, conjunto de 2 elementos y así sucesivamente.

Puede alguien decirme qué es exactamente la naturaleza de TakEx.WhenAll?

¿Fue útil?

Solución

La llamada a TaskEx.WhenAll se produce dentro del bucle. Usted tiene que poner fuera.

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

    }

Otros consejos

WhenAll() crear unas tareas que completa cuando todas las tareas de la sub completa. Por lo tanto, el método en sí no se completará, pero la tarea.

Es un método que crea una nueva tarea que los agregados de la tarea separada en una nueva tarea, más grande.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top