Frage

dachte ich TaskEx.WhenAll zurückkehren würde, wenn alle Aufgaben fertig werden, die innerhalb der Methode übergeben wird. So wartet auf TaskEx.WhenAll würde das Array von Return-Anweisungen geben, so dass, wenn jedes Objekt abgeschlossen wird, wird das Array zurückgegeben werden.

Aber es ist nicht so. Wenn ich tun:

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

    }

Ich sehe meine MessageBox mehr erscheint als einmal, und auch await Schritte mit Array von 1-Elemente, dann Array von 2 Elemente und so weiter.

Kann mir jemand sagen, was genau die Art von TakEx.WhenAll?

War es hilfreich?

Lösung

Der Aufruf von TaskEx.WhenAll tritt innerhalb der for-Schleife. Sie haben es setzen draußen.

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

    }

Andere Tipps

WhenAll() erstellen Sie eine Aufgabe, die abgeschlossen ist, wenn alle Teilaufgaben abgeschlossen. So ist das Verfahren selbst nicht abgeschlossen, aber die Aufgabe wird.

Es ist eine Methode, die eine neue Aufgabe, die Aggregate der separate Aufgabe in eine neue, größere Aufgabe erstellt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top