Странное исключение NullReferenceException из метода J2N HashSet AddInNotPresent, вызываемое Lucene.Net ⇐ C#
Странное исключение NullReferenceException из метода J2N HashSet AddInNotPresent, вызываемое Lucene.Net
Я публикую часть трассировки стека. Это исключение случается нерегулярно, и его трудно воспроизвести. Но обычно это происходит после выхода из простоя процесса IIS. (Сначала запустите его, некоторое время ничего не делайте, затем откройте страницу, которая как-то связана с поиском Lucene.Net). Я не очень разбираюсь в IIS. Будет очень полезно, если кто-нибудь поможет мне решить эту проблему~. Спасибо
Исключение: System.NullReferenceException: ссылка на объект не установлена на экземпляр объекта. в J2N.Collections.Generic.HashSet`1.AddIfNotPresent (значение T) в Lucene.Net.Index.IndexReader.SubscribeToGetCacheKeysEvent(GetCacheKeysEvent getCacheKeysEvent) в Lucene.Net.Search.FieldCacheImpl.Cache`2.Get (читатель AtomicReader, ключ TKey, логическое значение setDocsWithField) в Lucene.Net.Search.FieldCacheImpl.GetInt64s (читатель AtomicReader, строковое поле, парсер IInt64Parser, логический setDocsWithField) в Lucene.Net.Search.FieldComparer.Int64Comparer.SetNextReader (контекст AtomicReaderContext) в Lucene.Net.Search.TopFieldCollector.OneComparerNonScoringCollector.SetNextReader (контекст AtomicReaderContext) в Lucene.Net.Search.IndexSearcher.Search(листья IList`1, вес веса, сборщик ICollector) Я сомневаюсь, что мне следует увеличивать время простоя пула приложений, чтобы снизить частоту его возникновения. https://catchsoftware.com/knowledge-bas ... -timeouts/
Я проверяю метод AddIfNotPresent, но понятия не имею, какая ссылка может быть нулевой во время выполнения. Даже я знаю, где она находится, но не могу изменить ее, поскольку это библиотека.
private bool AddIfNotPresent (значение T) { если (_buckets == ноль) { Инициализировать(0); } интервал хэш-кода; целое ведро; Интервал коллизийCount = 0; Слот[] slots = _slots; IEqualityComparer? компаратор = _компарер; если (компаратор == ноль) { хэш-код = значение == ноль? 0: InternalGetHashCode(value.GetHashCode()); ведро = hashCode% _buckets!.Length; if (default(T)! != null) // TODO-NULLABLE: default(T) == нулевое предупреждение (https://github.com/dotnet/roslyn/issues/34757) { for (int i = _buckets[bucket] - 1; i >= 0; i = slots.next) { if (slots.hashCode == hashCode && EqualityComparer.Default.Equals(slots.value, value)) { вернуть ложь; } если (collisionCount >= slots.Length) { // Цепочка записей образует цикл, что означает, что произошло одновременное обновление. выдать новое InvalidOperationException(SR.InvalidOperation_ConcurrentOperationsNotSupported); } столкновениеCount++; } } еще { // Тип объекта: Shared Generic, EqualityComparer.Default не девиртуализируется // https://github.com/dotnet/coreclr/issues/17273 // Поэтому кэшируем локально, а не получаем EqualityComparer на каждой итерации цикла IEqualityComparer defaultComparer = EqualityComparer.Default; for (int i = _buckets[bucket] - 1; i >= 0; i = slots.next) { if (slots.hashCode == hashCode && defaultComparer.Equals(slots.value, value)) { вернуть ложь; } если (collisionCount >= slots.Length) { // Цепочка записей образует цикл, что означает, что произошло одновременное обновление. выдать новое InvalidOperationException(SR.InvalidOperation_ConcurrentOperationsNotSupported); } столкновениеCount++; } } } еще { хэш-код = значение == ноль? 0: InternalGetHashCode(компаратор.GetHashCode(значение)); ведро = hashCode% _buckets!.Length; for (int i = _buckets[bucket] - 1; i >= 0; i = slots.next) { if (slots.hashCode == hashCode && Comparer.Equals(slots.value, value)) { вернуть ложь; } если (collisionCount >= slots.Length) { // Цепочка записей образует цикл, что означает, что произошло одновременное обновление. выдать новое InvalidOperationException(SR.InvalidOperation_ConcurrentOperationsNotSupported); } столкновениеCount++; } } внутренний индекс; если (_freeList >= 0) { индекс = _freeList; _freeList = слоты[индекс].next; } еще { если (_lastIndex == slots.Length) { УвеличениеЕмкости(); // это изменится при изменении размера слоты = _slots; ведро = hashCode% _buckets.Length; } индекс = _lastIndex; _lastIndex++; } слоты[индекс].hashCode = hashCode; слоты[индекс].значение = значение; slots[index].next = _buckets[ведро] - 1; _buckets[ведро] = индекс + 1; _счет++; _версия++; вернуть истину; }
Я публикую часть трассировки стека. Это исключение случается нерегулярно, и его трудно воспроизвести. Но обычно это происходит после выхода из простоя процесса IIS. (Сначала запустите его, некоторое время ничего не делайте, затем откройте страницу, которая как-то связана с поиском Lucene.Net). Я не очень разбираюсь в IIS. Будет очень полезно, если кто-нибудь поможет мне решить эту проблему~. Спасибо
Исключение: System.NullReferenceException: ссылка на объект не установлена на экземпляр объекта. в J2N.Collections.Generic.HashSet`1.AddIfNotPresent (значение T) в Lucene.Net.Index.IndexReader.SubscribeToGetCacheKeysEvent(GetCacheKeysEvent getCacheKeysEvent) в Lucene.Net.Search.FieldCacheImpl.Cache`2.Get (читатель AtomicReader, ключ TKey, логическое значение setDocsWithField) в Lucene.Net.Search.FieldCacheImpl.GetInt64s (читатель AtomicReader, строковое поле, парсер IInt64Parser, логический setDocsWithField) в Lucene.Net.Search.FieldComparer.Int64Comparer.SetNextReader (контекст AtomicReaderContext) в Lucene.Net.Search.TopFieldCollector.OneComparerNonScoringCollector.SetNextReader (контекст AtomicReaderContext) в Lucene.Net.Search.IndexSearcher.Search(листья IList`1, вес веса, сборщик ICollector) Я сомневаюсь, что мне следует увеличивать время простоя пула приложений, чтобы снизить частоту его возникновения. https://catchsoftware.com/knowledge-bas ... -timeouts/
Я проверяю метод AddIfNotPresent, но понятия не имею, какая ссылка может быть нулевой во время выполнения. Даже я знаю, где она находится, но не могу изменить ее, поскольку это библиотека.
private bool AddIfNotPresent (значение T) { если (_buckets == ноль) { Инициализировать(0); } интервал хэш-кода; целое ведро; Интервал коллизийCount = 0; Слот[] slots = _slots; IEqualityComparer? компаратор = _компарер; если (компаратор == ноль) { хэш-код = значение == ноль? 0: InternalGetHashCode(value.GetHashCode()); ведро = hashCode% _buckets!.Length; if (default(T)! != null) // TODO-NULLABLE: default(T) == нулевое предупреждение (https://github.com/dotnet/roslyn/issues/34757) { for (int i = _buckets[bucket] - 1; i >= 0; i = slots.next) { if (slots.hashCode == hashCode && EqualityComparer.Default.Equals(slots.value, value)) { вернуть ложь; } если (collisionCount >= slots.Length) { // Цепочка записей образует цикл, что означает, что произошло одновременное обновление. выдать новое InvalidOperationException(SR.InvalidOperation_ConcurrentOperationsNotSupported); } столкновениеCount++; } } еще { // Тип объекта: Shared Generic, EqualityComparer.Default не девиртуализируется // https://github.com/dotnet/coreclr/issues/17273 // Поэтому кэшируем локально, а не получаем EqualityComparer на каждой итерации цикла IEqualityComparer defaultComparer = EqualityComparer.Default; for (int i = _buckets[bucket] - 1; i >= 0; i = slots.next) { if (slots.hashCode == hashCode && defaultComparer.Equals(slots.value, value)) { вернуть ложь; } если (collisionCount >= slots.Length) { // Цепочка записей образует цикл, что означает, что произошло одновременное обновление. выдать новое InvalidOperationException(SR.InvalidOperation_ConcurrentOperationsNotSupported); } столкновениеCount++; } } } еще { хэш-код = значение == ноль? 0: InternalGetHashCode(компаратор.GetHashCode(значение)); ведро = hashCode% _buckets!.Length; for (int i = _buckets[bucket] - 1; i >= 0; i = slots.next) { if (slots.hashCode == hashCode && Comparer.Equals(slots.value, value)) { вернуть ложь; } если (collisionCount >= slots.Length) { // Цепочка записей образует цикл, что означает, что произошло одновременное обновление. выдать новое InvalidOperationException(SR.InvalidOperation_ConcurrentOperationsNotSupported); } столкновениеCount++; } } внутренний индекс; если (_freeList >= 0) { индекс = _freeList; _freeList = слоты[индекс].next; } еще { если (_lastIndex == slots.Length) { УвеличениеЕмкости(); // это изменится при изменении размера слоты = _slots; ведро = hashCode% _buckets.Length; } индекс = _lastIndex; _lastIndex++; } слоты[индекс].hashCode = hashCode; слоты[индекс].значение = значение; slots[index].next = _buckets[ведро] - 1; _buckets[ведро] = индекс + 1; _счет++; _версия++; вернуть истину; }
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение