Skip to content

A way to handle exceptions from ValueChangedEventManager #10654

Open
@n9

Description

@n9

WPF uses the ValueChangedEventManager to track .NET objects that do not implement the INotifyPropertyChanged interface. There is already an issue to add a runtime switch option to disable the ValueChangedEventManager (#10148).

This issue is not about disabling the ValueChangedEventManager completely, but about being able to handle an exception when for example Equals (used in ConcurrentDictionary`2.TryGetValue) throws an Exception, as in the following example, where the exception is caused by the state of COM objects:

System.Runtime.InteropServices.COMException (0x80040201): An event was unable to invoke any of the subscribers (0x80040201)
 at UIAutomationClient.CUIAutomation8Class.IUIAutomation6_CompareElements(IUIAutomationElement el1, IUIAutomationElement el2)
 at MyApp.AutomationElement.Equals(Object obj)
 at System.Collections.Concurrent.ConcurrentDictionary`2.TryGetValue(TKey key, TValue& value)
 at System.ComponentModel.PropertyDescriptor.RemoveValueChanged(Object component, EventHandler handler)
 at MS.Internal.Data.ValueChangedEventManager.ValueChangedRecord.StopListening()
 at MS.Internal.Data.ValueChangedEventManager.Purge(Object source, Object data, Boolean purgeAll)
 at MS.Internal.WeakEventTable.Purge(Boolean purgeAll)
 at MS.Internal.WeakEventTable.OnShutDown()
 at System.Windows.Threading.Dispatcher.ShutdownImplInSecurityContext(Object state)
 at MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(Object obj)
 at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
 at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
 at MS.Internal.CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext executionContext, ContextCallback callback, Object state)
 at System.Windows.Threading.Dispatcher.ShutdownImpl()
 at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
 at System.Windows.Application.RunDispatcher(Object ignore)
 at System.Windows.Application.RunInternal(Window window)
 at MyApp.Main()

Metadata

Metadata

Assignees

No one assigned

    Labels

    InvestigateRequires further investigation by the WPF team.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions