Разочаровывающая ошибка в WPF (.NET 4.0): Ошибка вставки хэш-таблицы. Коэффициент загрузки слишком высокий
Я построил собственный движок правил, где каждый элемент этого движка является потомком DependencyObject
class, чтобы он мог быть описан в XAML, включая поддержку свойств зависимостей, расширений разметки, привязок и т. д. Целью этого механизма правил является обработка определенной информации, которая поступает в качестве входных данных, и возврат выходной информации обратно в очередь. Все дерево объекта создается один раз (из XAML) в одном потоке, а ряд объектов ввода обрабатывается из очереди ввода. Все работает нормально, пока я не увеличу количество потоков - иногда (не всегда!) Выдается следующее исключение:
System.InvalidOperationException: Hashtable insert failed. Load factor too high. The most common cause is multiple threads writing to the Hashtable simultaneously.
at System.Collections.Hashtable.Insert(Object key, Object nvalue, Boolean add)
at MS.Internal.Data.ValueChangedEventManager.PrivateAddListener(Object source, IWeakEventListener listener, PropertyDescriptor pd)
at MS.Internal.Data.PropertyPathWorker.ReplaceItem(Int32 k, Object newO, Object parent)
at MS.Internal.Data.PropertyPathWorker.UpdateSourceValueState(Int32 k, ICollectionView collectionView, Object newValue, Boolean isASubPropertyChange)
at MS.Internal.Data.PropertyPathWorker.OnDependencyPropertyChanged(DependencyObject d, DependencyProperty dp, Boolean isASubPropertyChange)
at System.Windows.Data.BindingExpression.HandlePropertyInvalidation(DependencyObject d, DependencyPropertyChangedEventArgs args)
at System.Windows.Data.BindingExpressionBase.OnPropertyInvalidation(DependencyObject d, DependencyPropertyChangedEventArgs args)
at System.Windows.Data.BindingExpression.OnPropertyInvalidation(DependencyObject d, DependencyPropertyChangedEventArgs args)
at System.Windows.DependentList.InvalidateDependents(DependencyObject source, DependencyPropertyChangedEventArgs sourceArgs)
at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
at System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal)
at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
...
Интересно, это ошибка во внутреннем интерфейсе WPF или мне нужно внимательнее взглянуть на мой код? Кто-нибудь сталкивался с такой проблемой раньше? Поскольку я не использую какие-либо глобальные небезопасные объекты, которые могут мешать друг другу, я ожидаю, что DependencyObject будет работать правильно в многопоточной среде, верно?
1 ответ
Попробуйте использовать оператор lock() для каждой записи, чтобы убедиться, что ваши записи не происходят одновременно.