多个请求并行和可观察集合

时间:2016-04-19 20:26:10

标签: c# parallel-processing task observablecollection

如何将此任务添加到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;
    }

1 个答案:

答案 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}); - 所以你将使用你的财产。如果在完成所有并行请求后再尝试使用该集合,请不要忘记清理集合。