我在遵循一个教程的玩具项目中获得了索引超出范围的异常。该循环应该启动一堆任务并将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
放入循环中,但是由于某些原因它没有效果。