简单的for循环中的“索引越界”异常:未知原因,索引变量超出数组长度

时间:2019-10-29 06:34:07

标签: c# async-await

我在遵循一个教程的玩具项目中获得了索引超出范围的异常。该循环应该启动一堆任务并将Task对象存储在数组中。 for循环完成后,我使用Task.WhenAll()等待任务并打印结果。循环应该在i < Pages.Length == false时终止,但是在i == Pages.Length时(在循环应该终止之后)会引发超出范围的错误。

我的主要问题是: 为什么我允许变量访问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.Length更改为i < Pages.Length - 1,这导致循环结束,但是稍后代码中出现空异常(预期)。

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

0 个答案:

没有答案