Hi,
we received a crash report from a customer:
Unhandled Exception:System.InvalidOperationException: Collection was modified; enumeration operation may not execute. at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource) at System.Collections.Generic.List`1.Enumerator.MoveNextRare() at ActiproSoftware.Internal.GT0.Draw(TextViewDrawContext ) at ActiproSoftware.Internal.CT4.vhu(TextViewDrawContext ) at ActiproSoftware.Internal.CT4.Nhn(CanvasDrawEventArgs ) at ActiproSoftware.Windows.Controls.SyntaxEditor.Primitives.TextView.Sni(Object , CanvasDrawEventArgs ) at ActiproSoftware.Windows.Controls.Rendering.CanvasControl.mli(DrawingContext ) at ActiproSoftware.Windows.Controls.Rendering.CanvasControl.OnRender(DrawingContext drawingContext) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.ContextLayoutManager.UpdateLayout() at System.Windows.ContextLayoutManager.UpdateLayoutCallback(Object arg) at System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks() at System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget) at System.Windows.Media.MediaContext.RenderMessageHandler(Object resizedCompositionTarget) at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler) at System.Windows.Threading.DispatcherOperation.InvokeImpl() at MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(Object obj) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at MS.Internal.CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext executionContext, ContextCallback callback, Object state) at System.Windows.Threading.DispatcherOperation.Invoke() at System.Windows.Threading.Dispatcher.ProcessQueue() at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler) at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) at System.Windows.Application.RunDispatcher(Object ignore) at System.Windows.Application.RunInternal(Window window) at Vector.ITE.Backbone.Startup.SingleInstanceApp.Run(String[] instanceArgs) at CAPLBrowser.App.CbrBootstrapper.$_executor_Run(String[] commandLineArgs, Container container) at CAPLBrowser.App.CbrBootstrapper.Run(String[] commandLineArgs, Container container) at Vector.ITE.Modularity.BootstrapperBase.RunCore(AssemblyCatalog assemblyCatalog, String cacheFile, ApplicationScope applicationScope, ApplicationMode applicationMode, String[] commandLineArgs) at CAPLBrowser.App.Program.Main(String[] args) at CAPLBrowser.App.Program.Main(String[] args)
The version the customer is using is 22.1.1, but we already upgraded to 22.1.4. However I could not find any matching description in the anouncement posts, so I assume the problem still exists.
I looked at the code and it seems the problem occurs in the Draw callback of the AdornmentLayer.
My best guess is that, since the squiggle error tags are created in the parser thread, this collides with the rendering process in the UI thread.
Best regards, Tobias Lingemann.