如何将此任务添加到observableCollection?它随时循环,它取代了集合中的项目。我希望它循环并存储4个项目,即总共8个项目。然后再循环并添加另外4个项目,而不是替换第一个项目。我应该返回照片,但如果我这样做,我会努力因为int和Observable集合之间的隐式转换冲突。 PS。我仍然希望并行维护多个请求
private async Task<int> ProcessURL(string url, HttpClient client)
{
HttpResponseMessage response = await client.GetAsync(url);
var responseContent = await response.Content.ReadAsStringAsync();
HtmlDocument htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(responseContent);
ObservableCollection<Photo> photo = new ObservableCollection<Movie>();
foreach (var div in htmlDocument.DocumentNode.Descendants().Where(i => i.Name == "div" && i.GetAttributeValue("class", "").StartsWith("ml-item")))
{
String image = div.Descendants().Where(i => i.Name == "img").FirstOrDefault().GetAttributeValue("data-original", "");
photo.Add(new Photo() { Image = image });
}
return something;
}
答案 0 :(得分:0)
据我所知,您的问题(从示例中假设)是每次调用Process URL时都会创建ObesrvableCollection。因此,为了能够存储来自并行请求的所有照片,您需要将此ObesrvableCollection移出您的方法并将其作为私有字段或属性。但是为了避免从并行请求访问集合时出现同步问题,您需要使用Concurrent ObservableCollection - 您可以在以下主题中找到此示例:Concurrent Observable Collection, Dictionary, and Sorted Dictionary
只需从方法中删除ObservableCollection<Photo> photo = new ObservableCollection<Movie>();
,然后使用ConcurrentObservableCollection类型将已解析的照片添加到类范围属性或字段中。
首先,您需要从文章下载源代码并从那里获取ConcurrentObservableCollection类并添加到您的项目中。然后将类型:ObservableCollection更改为ConcurrentObservableCollection。在你的ProcessURL里面删除ObservableCollection photo = new ObservableCollection();并最终改变photo.Add(新照片(){Image = image}); to _photo.Add(new Photo(){Image = image}); - 所以你将使用你的财产。如果在完成所有并行请求后再尝试使用该集合,请不要忘记清理集合。