/// <summary> /// 搜索下一页 /// </summary> public async Task SearchNextPageAsync(CancellationToken token) { var newVPage = new SearchedPage(); // 建立虚拟页信息 var images = new MoeItems(); SearchPara tempPara; if (LoadedPages.Count == 0) { tempPara = CurrentSearchPara.Clone(); // 浅复制一份参数 newVPage.LastRealPageIndex = tempPara.PageIndex; // 搜索起始页的所有图片(若网站查询参数有支持的条件过滤,则在搜索时就已自动过滤相关条件) var sb = new StringBuilder(); sb.AppendLine($"正在搜索站点 {tempPara.Site.DisplayName} 第 {tempPara.PageIndex} 页图片"); sb.Append($"(参数:kw:{(!tempPara.Keyword.IsEmpty() ? tempPara.Keyword : "N/A")},num:{tempPara.Count})"); Extend.ShowMessage(sb.ToString(), null, Extend.MessagePos.Searching); var imagesOrg = await tempPara.Site.GetRealPageImagesAsync(tempPara, token); if (imagesOrg == null || imagesOrg.Count == 0) { Extend.ShowMessage("无搜索结果", null, Extend.MessagePos.Searching); return; } for (var i = 0; i < imagesOrg.Count; i++) { var item = imagesOrg[i]; if (i < tempPara.Count) { images.Add(item); } else { newVPage.PreLoadNextPageItems.Add(item); if (!newVPage.HasNextPage) { newVPage.HasNextPage = true; } } } } else if (!LoadedPages.Last().HasNextPage) // 若无下一页则返回 { return; } else { tempPara = CurrentSearchPara.Clone(); // 浅复制一份参数 tempPara.PageIndex = LoadedPages.Last().LastRealPageIndex; // 若不是第一页则使用上一页搜索多出来的图片作为本页基数 images = new MoeItems(); for (var i = 0; i < LoadedPages.Last().PreLoadNextPageItems.Count; i++) { var item = LoadedPages.Last().PreLoadNextPageItems[i]; if (i < tempPara.Count) { images.Add(item); } else { newVPage.PreLoadNextPageItems.Add(item); newVPage.HasNextPage = true; } } } Filter(images); // 本地过滤,images数量有可能减少 // 进入 loop 循环 var startTime = DateTime.Now; while (images.Count < tempPara.Count) // 当images数量不够搜索参数数量时循环 { token.ThrowIfCancellationRequested(); // 整体Task的取消Token,取消时会抛出异常 tempPara.PageIndex++; // 设置新搜索参数为下一页(真) tempPara.LastId = images.LastOrDefault()?.Id ?? 0; // 设置新搜索参数为最后ID(真) newVPage.LastRealPageIndex = tempPara.PageIndex; var sb = new StringBuilder(); sb.AppendLine($"正在搜索站点 {tempPara.Site.DisplayName} 第 {tempPara.PageIndex} 页图片"); sb.AppendLine($"已获取第{tempPara.PageIndex - 1}页{images.Count}张图片,还需{tempPara.Count - images.Count}张"); sb.Append($"(参数:kw:{(!tempPara.Keyword.IsEmpty() ? tempPara.Keyword : "N/A")},num:{tempPara.Count})"); Extend.ShowMessage(sb.ToString(), null, Extend.MessagePos.Searching); var imagesNextRPage = await tempPara.Site.GetRealPageImagesAsync(tempPara, token); // 搜索下一页(真)的所有图片 if (imagesNextRPage == null || imagesNextRPage.Count == 0) // 当下一页(真)的搜索到的未进行本地过滤图片数量为0时,表示已经搜索完了 { newVPage.HasNextPage = false; // 没有下一页 newVPage.LastRealPageIndex = tempPara.PageIndex; break; } else // 当下一页(真)未过滤图片数量不为0时 { Filter(imagesNextRPage); // 本地过滤下一页(真) foreach (var item in imagesNextRPage) { if (images.Count < tempPara.Count) { images.Add(item); // 添加图片数量直到够参数设定的图片数量为止 } else { newVPage.PreLoadNextPageItems.Add(item); // 多出来的图片存在另一个对象中,下一虚拟页可以调用 } } if (images.Count >= tempPara.Count) { break; // 数量已够参数数量,当前虚拟页完成任务 } } if (DateTime.Now - startTime > TimeSpan.FromSeconds(30)) { break; // loop超时跳出循环(即使不够数量也跳出) } } token.ThrowIfCancellationRequested(); // Load end newVPage.ImageItems = images; LoadedPages.Add(newVPage); if (images.Message != null) { Extend.ShowMessage(images.Message); } if (images.Ex != null) { Extend.ShowMessage(images.Ex.Message, images.Ex.ToString(), Extend.MessagePos.Window); } Extend.ShowMessage("搜索完毕", null, Extend.MessagePos.Searching); }