2011-09-12 1 views
0

이 엔진의 각 요소가 DependencyObject 클래스의 하위 요소 인 사용자 지정 규칙 엔진을 구축하여 종속성 속성, 태그 확장, 바인딩 등을 비롯한 XAML에 설명 될 수 있도록했습니다. 이 규칙 엔진의 목적은 입력으로 제공되는 특정 정보를 처리하고 출력 정보를 다시 대기열로 반환하는 것입니다. 개체 트리 전체가 단일 스레드에서 한 번 인스턴스화되고 (XAML에서) 일련의 입력 개체가 입력 큐에서 처리되고 있습니다. 이 WPF 내부의 버그,WPF (.NET 4.0) 내부 오류 발생 : Hashtable 삽입에 실패했습니다. 로드 비율이 너무 높음

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) 
... 

그래서 궁금 아니면 더 자세히 살펴 봐야 할 필요가 : (! 항상) 때때로 다음과 같은 예외를 throw - 내가 스레드의 수를 증가 할 때까지 모든 잘 작동합니다 내 코드에서? 누구든지 전에 그런 경험을 했습니까? 서로 간섭 할 수있는 전역 스레드 안전하지 않은 개체를 사용하지 않으므로 DependencyObject가 멀티 스레드 환경에서 올바르게 작동 할 것으로 기대합니까?

+0

[HashTable] (http://msdn.microsoft.com/en-us/library/system.collections.hashtable.aspx) 스레드 안전 섹션을 기반으로 여러 명의 독자와 하나의 작성자가 있어야합니다. 진짜 질문은이 DependecyObject에 1 위치에서만 쓰고 그 스레드와 연관된 스레드는 무엇입니까? – ShelbyZ

+0

예 DependencyObject의 속성을 생성 한 동일한 스레드에서 조작하고 있습니다. 다른 스레드의 다중 판독기가 없습니다. 모든 읽기/쓰기가 동일한 스레드에서 수행됩니다! – yuramag

+0

DependecyObject가 멀티 스레드 환경에서는 작동하지 않지만 HashTable에서는 여러 개의 삽입이 가능할 것이라는 기대가 있다고 생각하지 않습니다. DependecyObject와는 관련이없는 문제에 대한 몇 가지 의문점이 있지만, .Insert (...) 호출을 안전하게 유지하는 것으로 귀결됩니다. http://stackoverflow.com/questions/505322/hashtable-insert-failed-load-factor-too-high-asp-net-2-0 스레드 동기화 메커니즘을 이 교착 상태를 피할 수 있는지 확인하려면 Lock (...)과 같은 삽입하십시오. – ShelbyZ

답변

0

모든 글마다 lock() 문을 사용하여 쓰기가 동시에 일어나지 않는지 확인하십시오.

+0

필자는 종속성 속성을 사용하는 목적이 모두 XAML의 원본 개체에 자동으로 바인딩 될 수 있기 때문에이 작업을 수행 할 수 없습니다. 위의 스택 프레임을 보면 오류가 발생한 후 : System.Windows.DependencyObject.SetValue (DependencyProperty dp, Object value) 오류가 발생하며 제어 할 수 없습니다. – yuramag

관련 문제