Domanda

Ho pensato TaskEx.WhenAll sarebbe tornato quando tutti i compiti ottiene finiti che viene passato all'interno del metodo. Quindi, attendere il TaskEx.WhenAll restituirebbe la serie di dichiarazioni di ritorno, in modo tale che quando ogni oggetto viene terminato, verrà restituito l'array.

Ma non è così. Quando faccio:

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

    }

Vedo il mio MessageBox appare più di una volta, e anche passaggi attendono in con matrice di 1 elemento, quindi array di 2 elementi e così via.

Qualcuno può dirmi che cosa è esattamente la natura del TakEx.WhenAll?

È stato utile?

Soluzione

La chiamata a TaskEx.WhenAll avviene all'interno del ciclo for. Dovete mettere fuori.

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

    }

Altri suggerimenti

WhenAll() creare un attività che completa quando tutte le attività della sub completa. Così, il metodo in sé non sarà completa, ma il compito sarà.

E 'un metodo che crea un nuovo compito che gli aggregati il ??compito separata in un nuovo, compito più grande.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top