1

メソッド内で渡されるすべてのタスクが終了すると、TaskEx.WhenAllが返されると思いました。したがって、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.WhenAllの性質を正確に教えてもらえますか?

4

2 に答える 2

3

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

    }
于 2010-11-13T21:31:21.813 に答える
2

WhenAll()すべてのサブタスクが完了したときに完了するタスクを作成します。したがって、メソッド自体は完了しませんが、タスクは完了します。

これは、個別のタスクを新しい、より大きなタスクに集約する新しいタスクを作成するメソッドです。

于 2010-11-13T21:26:50.273 に答える