1

我认为 TaskEx.WhenAll 会在方法中传递的所有任务完成时返回。因此,TaskEx.WhenAll 上的 await 将返回 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 回答