我在按照教程制作的玩具项目中遇到索引越界异常。该循环应该启动一堆任务并将任务对象存储在一个数组中。在 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.Length为i < Pages.Length - 1,这导致循环完成,但稍后在代码中出现空异常(预期)。
我也尝试过if(i >= Pages.Length) break进入循环,但由于某种原因它没有效果。