Должно быть, я где-то делаю что-то не так, потому что я получаю дубликаты элементов в своем concurrentbag, вот цепочка событий
var listings = new ConcurrentBag<JSonListing>();
Parallel.ForEach(Types, ParallelOptions, (type, state) =>
{
...
status = ProcessType(listings, status, type, state);
....
});
private GeocodeResults ProcessType(ConcurrentBag<JSonListing> listings, GeocodeResults status, XElement type, ParallelLoopState state)
{
....
AddListingsToList(results, type, listings);
....
}
private void AddListingsToList(dynamic results, XElement type, ConcurrentBag<JSonListing> listings)
{
var typeMustMatch = type.Attribute("TypeMustMatch").Value;
var typeID = Convert.ToInt32(type.Attribute("ID").Value);
foreach (var result in results.results)
{
var foundListing = listings.SingleOrDefault(x => x.ID == result.id);
if (foundListing != null)
{
var typeIDs = foundListing.TypeIDs.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList();
if (!typeIDs.Contains(typeID.ToString()))
{
foundListing.TypeIDs += "|" + typeID;
}
}
else
{
var listing = new JSonListing { ID = result.id, ReferenceNumber = result.reference, TypeIDs = typeID.ToString(), TypeMustMatch = typeMustMatch };
listings.Add(listing);
}
}
}
Список добавления должен гарантировать, что, если элемент уже существует, не будет добавлен другой элемент с тем же идентификатором, а вместо этого будет обновлено какое-то свойство. Теперь ошибка, которую я получаю,
System.InvalidOperationException: последовательность содержит более одного соответствующего элемента
в System.Linq.Enumerable.SingleOrDefault[TSource](источник IEnumerable`1, предикат Func`2)
в LocalSearch.Processor.CityProcessor.AddListingsToList(результаты объекта , тип XElement, списки ConcurrentBag`1) в d:\Projects\ListingLocator2\Code\LocalSearch.Processor\Processors.cs:строка 310
в CallSite.Target(Closure, CallSite, CityProcessor, Object, XElement, ConcurrentBag`1 )
в LocalSearch.Processor.CityProcessor.ProcessType(списки ConcurrentBag`1, статус GeocodeResults, тип XElement, состояние ParallelLoopState) в d:\Projects\ListingLocator2\Code\LocalSearch.Processor\Processors.cs:строка 249
в LocalSearch.Processor.CityProcessor.‹>c__DisplayClass4.b__0(тип XElement, состояние ParallelLoopState) в d:\Projects\ListingLocator2\Code\LocalSearch.Processor\Processors.cs:строка 137
ProcessType
будет иметь значительные побочные эффекты, которые были исключены из примера. - person Jon   schedule 07.02.2014