0

我在按照教程制作的玩具项目中遇到索引越界异常。该循环应该启动一堆任务并将任务对象存储在一个数组中。在 for 循环完成后,我等待使用的任务Task.WhenAll()并打印结果。循环应该在什么时候终止,但是在什么时候(在循环应该终止之后)i < Pages.Length == false抛出了越界错误。i == Pages.Length

我的主要问题是:为什么允许变量 i 达到 Pages.Length?

这似乎是一个非常常见的循环,因此任何对此的见解将不胜感激。

(有问题的循环是第 6 行的最顶层循环)

        private async void AsyncClick(object sender, RoutedEventArgs e)
        {
            Stopwatch watch = Stopwatch.StartNew();
            Task<WebPageData>[] tasks = new Task<WebPageData>[Pages.Length];
            ConsoleOutput = $"Starting Download {Environment.NewLine}";
            for (int i = 0; i < Pages.Length; i++)
            {
                tasks[i] = Task.Run(() => DownloadPage(Pages[i]));
            }

            WebPageData[] results = await Task.WhenAll(tasks);

            for (int i = 0; i < tasks.Length; i++)
            {
                ConsoleOutput += $"{results[i].URL} : The length is {results[i].PageContents.Length}{Environment.NewLine}";
            }

            watch.Stop();
            ConsoleOutput += $"Finished downloading in time: {watch.ElapsedMilliseconds} ms";
        }


        private WebPageData DownloadPage(string websiteUrl)
        {
            WebClient client = new WebClient();
            WebPageData data = new WebPageData() { URL = websiteUrl };

            data.PageContents = client.DownloadString(data.URL);
            return data;
        }

由于代码是调试器在i == Pages.Length == 3.

我尝试更改i < Pages.Lengthi < Pages.Length - 1,这导致循环完成,但稍后在代码中出现空异常(预期)。

我也尝试过if(i >= Pages.Length) break进入循环,但由于某种原因它没有效果。

4

0 回答 0