Details
-
Bug
-
Resolution: Fixed
-
Major
-
2.3.2
-
None
Description
<p>Under some circumstances the DynamicResourceExtension can crash the main render loop if it's attached resources/properties are updated whilst being disposed. Implement a lock in the same way as BindingExtension does.</p>
<p>Stacktrace of crash</p>
<p>[DX Render] [ERROR] - SkinEngine MainForm: Main render loop crashed<br>
System.InvalidOperationException: Collection was modified; enumeration operation may not execute.<br>
at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)<br>
at System.Collections.Generic.List`1.Enumerator.MoveNextRare()<br>
at System.Collections.Generic.List`1.Enumerator.MoveNext()<br>
at MediaPortal.UI.SkinEngine.MarkupExtensions.DynamicResourceExtension.ResetEventHandlerAttachments()<br>
at MediaPortal.UI.SkinEngine.MarkupExtensions.DynamicResourceExtension.Dispose()<br>
at MediaPortal.UI.SkinEngine.MpfElements.DependencyObject.DisposeBindings()<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.OnUpdateElementState()<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.FrameworkElement.OnUpdateElementState()<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.set_ElementState(ElementState value)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.SetElementStateAction.Execute(UIElement element)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.ForEachElementInTree_BreadthFirst(IUIElementAction action)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.SetElementState(ElementState state)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.OnTemplateControlChanged(AbstractProperty property, Object oldValue)<br>
at MediaPortal.Common.General.SProperty.Fire(Object oldValue) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\SProperty.cs:line 73<br>
at MediaPortal.Common.General.AbstractProperty.SetValue(Object value) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\AbstractProperty.cs:line 121<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.set_TemplateControl(FrameworkElement value)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.OnTemplateChanged(AbstractProperty property, Object oldValue)<br>
at MediaPortal.Common.General.SProperty.Fire(Object oldValue) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\SProperty.cs:line 73<br>
at MediaPortal.Common.General.AbstractProperty.SetValue(Object value) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\AbstractProperty.cs:line 121<br>
at MediaPortal.UI.SkinEngine.Xaml.DependencyPropertyDataDescriptor.set_Value(Object value)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.SetValueInRenderThread(IDataDescriptor dataDescriptor, Object value)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.SetBindingValue(IDataDescriptor dd, Object value)<br>
at MediaPortal.UI.SkinEngine.MarkupExtensions.DynamicResourceExtension.UpdateTarget(Object value)<br>
at MediaPortal.UI.SkinEngine.MarkupExtensions.DynamicResourceExtension.UpdateTarget()<br>
at MediaPortal.UI.SkinEngine.MarkupExtensions.DynamicResourceExtension.Activate()<br>
at MediaPortal.UI.SkinEngine.MpfElements.DependencyObject.ActivateBindings()<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.OnUpdateElementState()<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.FrameworkElement.OnUpdateElementState()<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.set_ElementState(ElementState value)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.SetElementStateAction.Execute(UIElement element)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.ForEachElementInTree_BreadthFirst(IUIElementAction action)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.SetElementState(ElementState state)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.OnTemplateControlChanged(AbstractProperty property, Object oldValue)<br>
at MediaPortal.Common.General.PropertyChangedHandler.Invoke(AbstractProperty property, Object oldValue)<br>
at MediaPortal.Common.General.SProperty.Fire(Object oldValue) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\SProperty.cs:line 73<br>
at MediaPortal.Common.General.AbstractProperty.SetValue(Object value) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\AbstractProperty.cs:line 121<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.set_TemplateControl(FrameworkElement value)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.OnTemplateChanged(AbstractProperty property, Object oldValue)<br>
at MediaPortal.Common.General.SProperty.Fire(Object oldValue) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\SProperty.cs:line 73<br>
at MediaPortal.Common.General.AbstractProperty.SetValue(Object value) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\AbstractProperty.cs:line 121<br>
at MediaPortal.UI.SkinEngine.Xaml.DependencyPropertyDataDescriptor.set_Value(Object value)<br>
at MediaPortal.UI.SkinEngine.MpfElements.DependencyObject.SetDataDescriptorValueWithLP(IDataDescriptor dd, Object value)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.Styles.Setter.Set(UIElement element)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.Styles.Style.UpdateSettersAndCollectTriggers(UIElement element, ICollection`1 finishedProperties, ICollection`1 triggers)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.Styles.Style.Set(UIElement element)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.FrameworkElement.UpdateStyle(Style oldStyle)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.FrameworkElement.OnUpdateElementState()<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.ContentControl.OnUpdateElementState()<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.set_ElementState(ElementState value)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.SetElementStateAction.Execute(UIElement element)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.ForEachElementInTree_BreadthFirst(IUIElementAction action)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.SetElementState(ElementState state)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.OnTemplateControlChanged(AbstractProperty property, Object oldValue)<br>
at MediaPortal.Common.General.SProperty.Fire(Object oldValue) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\SProperty.cs:line 73<br>
at MediaPortal.Common.General.AbstractProperty.SetValue(Object value) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\AbstractProperty.cs:line 121<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.set_TemplateControl(FrameworkElement value)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.OnTemplateChanged(AbstractProperty property, Object oldValue)<br>
at MediaPortal.Common.General.SProperty.Fire(Object oldValue) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\SProperty.cs:line 73<br>
at MediaPortal.Common.General.AbstractProperty.SetValue(Object value) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\AbstractProperty.cs:line 121<br>
at MediaPortal.UI.SkinEngine.Xaml.DependencyPropertyDataDescriptor.set_Value(Object value)<br>
at MediaPortal.UI.SkinEngine.MpfElements.DependencyObject.SetDataDescriptorValueWithLP(IDataDescriptor dd, Object value)<br>
at MediaPortal.UI.SkinEngine.ScreenManagement.Animator.SetValues()<br>
at MediaPortal.UI.SkinEngine.ScreenManagement.Screen.SetValues()<br>
at MediaPortal.UI.SkinEngine.ScreenManagement.ScreenManager.Render()<br>
at MediaPortal.UI.SkinEngine.DirectX.RenderPipelines.AbstractRenderPipeline.Render()<br>
at MediaPortal.UI.SkinEngine.DirectX.GraphicsDevice.Render(Boolean doWaitForNextFame)<br>
at MediaPortal.UI.SkinEngine.GUI.MainForm.RenderLoop()</p>
<p>Stacktrace of crash</p>
<p>[DX Render] [ERROR] - SkinEngine MainForm: Main render loop crashed<br>
System.InvalidOperationException: Collection was modified; enumeration operation may not execute.<br>
at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)<br>
at System.Collections.Generic.List`1.Enumerator.MoveNextRare()<br>
at System.Collections.Generic.List`1.Enumerator.MoveNext()<br>
at MediaPortal.UI.SkinEngine.MarkupExtensions.DynamicResourceExtension.ResetEventHandlerAttachments()<br>
at MediaPortal.UI.SkinEngine.MarkupExtensions.DynamicResourceExtension.Dispose()<br>
at MediaPortal.UI.SkinEngine.MpfElements.DependencyObject.DisposeBindings()<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.OnUpdateElementState()<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.FrameworkElement.OnUpdateElementState()<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.set_ElementState(ElementState value)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.SetElementStateAction.Execute(UIElement element)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.ForEachElementInTree_BreadthFirst(IUIElementAction action)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.SetElementState(ElementState state)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.OnTemplateControlChanged(AbstractProperty property, Object oldValue)<br>
at MediaPortal.Common.General.SProperty.Fire(Object oldValue) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\SProperty.cs:line 73<br>
at MediaPortal.Common.General.AbstractProperty.SetValue(Object value) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\AbstractProperty.cs:line 121<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.set_TemplateControl(FrameworkElement value)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.OnTemplateChanged(AbstractProperty property, Object oldValue)<br>
at MediaPortal.Common.General.SProperty.Fire(Object oldValue) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\SProperty.cs:line 73<br>
at MediaPortal.Common.General.AbstractProperty.SetValue(Object value) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\AbstractProperty.cs:line 121<br>
at MediaPortal.UI.SkinEngine.Xaml.DependencyPropertyDataDescriptor.set_Value(Object value)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.SetValueInRenderThread(IDataDescriptor dataDescriptor, Object value)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.SetBindingValue(IDataDescriptor dd, Object value)<br>
at MediaPortal.UI.SkinEngine.MarkupExtensions.DynamicResourceExtension.UpdateTarget(Object value)<br>
at MediaPortal.UI.SkinEngine.MarkupExtensions.DynamicResourceExtension.UpdateTarget()<br>
at MediaPortal.UI.SkinEngine.MarkupExtensions.DynamicResourceExtension.Activate()<br>
at MediaPortal.UI.SkinEngine.MpfElements.DependencyObject.ActivateBindings()<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.OnUpdateElementState()<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.FrameworkElement.OnUpdateElementState()<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.set_ElementState(ElementState value)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.SetElementStateAction.Execute(UIElement element)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.ForEachElementInTree_BreadthFirst(IUIElementAction action)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.SetElementState(ElementState state)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.OnTemplateControlChanged(AbstractProperty property, Object oldValue)<br>
at MediaPortal.Common.General.PropertyChangedHandler.Invoke(AbstractProperty property, Object oldValue)<br>
at MediaPortal.Common.General.SProperty.Fire(Object oldValue) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\SProperty.cs:line 73<br>
at MediaPortal.Common.General.AbstractProperty.SetValue(Object value) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\AbstractProperty.cs:line 121<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.set_TemplateControl(FrameworkElement value)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.OnTemplateChanged(AbstractProperty property, Object oldValue)<br>
at MediaPortal.Common.General.SProperty.Fire(Object oldValue) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\SProperty.cs:line 73<br>
at MediaPortal.Common.General.AbstractProperty.SetValue(Object value) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\AbstractProperty.cs:line 121<br>
at MediaPortal.UI.SkinEngine.Xaml.DependencyPropertyDataDescriptor.set_Value(Object value)<br>
at MediaPortal.UI.SkinEngine.MpfElements.DependencyObject.SetDataDescriptorValueWithLP(IDataDescriptor dd, Object value)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.Styles.Setter.Set(UIElement element)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.Styles.Style.UpdateSettersAndCollectTriggers(UIElement element, ICollection`1 finishedProperties, ICollection`1 triggers)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.Styles.Style.Set(UIElement element)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.FrameworkElement.UpdateStyle(Style oldStyle)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.FrameworkElement.OnUpdateElementState()<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.ContentControl.OnUpdateElementState()<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.set_ElementState(ElementState value)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.SetElementStateAction.Execute(UIElement element)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.ForEachElementInTree_BreadthFirst(IUIElementAction action)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.SetElementState(ElementState state)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.OnTemplateControlChanged(AbstractProperty property, Object oldValue)<br>
at MediaPortal.Common.General.SProperty.Fire(Object oldValue) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\SProperty.cs:line 73<br>
at MediaPortal.Common.General.AbstractProperty.SetValue(Object value) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\AbstractProperty.cs:line 121<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.set_TemplateControl(FrameworkElement value)<br>
at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.OnTemplateChanged(AbstractProperty property, Object oldValue)<br>
at MediaPortal.Common.General.SProperty.Fire(Object oldValue) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\SProperty.cs:line 73<br>
at MediaPortal.Common.General.AbstractProperty.SetValue(Object value) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\AbstractProperty.cs:line 121<br>
at MediaPortal.UI.SkinEngine.Xaml.DependencyPropertyDataDescriptor.set_Value(Object value)<br>
at MediaPortal.UI.SkinEngine.MpfElements.DependencyObject.SetDataDescriptorValueWithLP(IDataDescriptor dd, Object value)<br>
at MediaPortal.UI.SkinEngine.ScreenManagement.Animator.SetValues()<br>
at MediaPortal.UI.SkinEngine.ScreenManagement.Screen.SetValues()<br>
at MediaPortal.UI.SkinEngine.ScreenManagement.ScreenManager.Render()<br>
at MediaPortal.UI.SkinEngine.DirectX.RenderPipelines.AbstractRenderPipeline.Render()<br>
at MediaPortal.UI.SkinEngine.DirectX.GraphicsDevice.Render(Boolean doWaitForNextFame)<br>
at MediaPortal.UI.SkinEngine.GUI.MainForm.RenderLoop()</p>