Я создал собственный обработчик правил, где каждый элемент этого механизма является потомком класса DependencyObject
, чтобы его можно было описать в 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 будет работать правильно в многопоточной среде, верно?