Я использую asp.net core api с ядром EF, и сегодня я получил это сообщение об ошибке, и оно сбивает меня с толку, почему это могло произойти.
Operations that change non-concurrent collections must have exclusive access. A concurrent update was performed on this collection and corrupted its state. The collection's state is no longer correct.
at System.Collections.Generic.Dictionary`2.FindEntry(TKey key)
at System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value)
at Mapster.TypeAdapterConfig.Remove(TypeTuple key)
at Mapster.TypeAdapterConfig.NewConfig[TSource,TDestination]()
at InventoryService.GetCategories(Int32 inventoryCenterId)
at Controllers.InventoriesController.GetCategories(Int32 centerId)
это код, о котором идет речь.
TypeAdapterConfig<Category, CategoryDto>
.NewConfig()
.IgnoreIf((src, dest) => string.IsNullOrEmpty(src.MetaTitle), dest => dest.MetaTitle)
.IgnoreIf((src, dest) => string.IsNullOrEmpty(src.MetaDescription), dest => dest.MetaDescription);
var categories = dbContext.Centers.Where(x => x.Id == CenterId).SelectMany(x => x.Categories).OrderBy(x => x.Name).ToList();
return categories.Adapt<List<CategoryDto>>();
Похоже, что любой, кто пытался получить доступ к этому методу, совершал ту же ошибку. Я сбросил IIS, и все прошло хорошо, но я пытаюсь понять, что произошло.
Не уверен, что еще добавить.
.NetCore намеренно генерирует исключение InvalidOperationException с указанным сообщением, когда словарь изменяется несколькими потоками. Ключ в том, чтобы использовать потокобезопасный ConcurrentDictionary.
Пожалуйста, посмотрите Проблема с GitHub.