<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: GroupLayer: Layer pointer should be locked before being accessed. in ArcGIS Runtime SDK for WPF (Retired) Questions</title>
    <link>https://community.esri.com/t5/arcgis-runtime-sdk-for-wpf-retired-questions/grouplayer-layer-pointer-should-be-locked-before/m-p/295039#M1470</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Thanks, this fix works.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 21 Aug 2013 13:47:58 GMT</pubDate>
    <dc:creator>BKuiper</dc:creator>
    <dc:date>2013-08-21T13:47:58Z</dc:date>
    <item>
      <title>GroupLayer: Layer pointer should be locked before being accessed.</title>
      <link>https://community.esri.com/t5/arcgis-runtime-sdk-for-wpf-retired-questions/grouplayer-layer-pointer-should-be-locked-before/m-p/295036#M1467</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Hi,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm experiencing problems when trying to remove a GroupLayer from the Map. It keeps crashing on the NativeLayerPointer with the following error&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;"Layer pointer should be locked before being accessed." when trying to retrieve the pointer.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Is there a specific way how GroupLayers should be removed ?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;How can i provide more debug information to Esri so this can be fixed or resolved? I'm not sure if I can provide a PoC.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Thank you&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;EDIT 2:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I think it is a threading issue when multiple layers are being added to the GroupLayer, which causes the _lockedOnThreadId, _lockCount to be out of sync, but this is a guess. I'm further investigating. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;There should probably be a lock on the '_lockCount' integer.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;EDIT 1: Call stack:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;System.InvalidOperationException: Layer pointer should be locked before being accessed.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at ESRI.ArcGIS.Client.Runtime.NativeLayerPointer.get_Ptr()&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at ESRI.ArcGIS.Client.Runtime.NativeLayerPointer.op_Implicit(NativeLayerPointer p)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at ESRI.ArcGIS.Client.Runtime.NativeGroupLayer.RemoveLayer(Layer layer)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at ESRI.ArcGIS.Client.Runtime.NativeGroupLayer.ClearChildLayers(IEnumerable`1 layers)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at ESRI.ArcGIS.Client.Runtime.NativeGroupLayer.Dispose(Boolean disposing)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at ESRI.ArcGIS.Client.Runtime.NativeLayer.Dispose()&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at ESRI.ArcGIS.Client.Runtime.NativeGroupLayer.Dispose()&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at ESRI.ArcGIS.Client.NativeMap.RemoveLayer(Layer layer)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at ESRI.ArcGIS.Client.DrawingSurface.RemoveLayer(Layer layer)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at ESRI.ArcGIS.Client.Map.RemoveMapLayer(Layer layer)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at ESRI.ArcGIS.Client.Map.Layers_CollectionChanged(Object sender, NotifyCollectionChangedEventArgs e)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at System.Collections.ObjectModel.Collection`1.Remove(T item)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at XXX.LayerManagement.LayerManager.RemoveLayer(Layer layer) in XXX\LayerManager.cs:line 463&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at XXXViewModel.ExecuteRemoveLayerCmd(Object parameter) in XXXViewModel.cs:line 391&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at DelegateCommand.Execute(Object parameter) in DelegateCommand.cs:line 117&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at Telerik.Windows.Controls.RadMenuItem.ExecuteCommand() in c:\TB\117\WPF_Scrum\Release_WPF\Sources\Development\Controls\Navigation\Menu\RadMenuItem.cs:line 3202&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at Telerik.Windows.Controls.RadMenuItem.OnClickImpl() in c:\TB\117\WPF_Scrum\Release_WPF\Sources\Development\Controls\Navigation\Menu\RadMenuItem.cs:line 1686&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at Telerik.Windows.Controls.RadMenuItem.OnClick() in c:\TB\117\WPF_Scrum\Release_WPF\Sources\Development\Controls\Navigation\Menu\RadMenuItem.cs:line 2330&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at Telerik.Windows.Controls.RadMenuItem.ClickItem() in c:\TB\117\WPF_Scrum\Release_WPF\Sources\Development\Controls\Navigation\Menu\RadMenuItem.cs:line 3722&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at Telerik.Windows.Controls.RadMenuItem.HandleMouseUp() in c:\TB\117\WPF_Scrum\Release_WPF\Sources\Development\Controls\Navigation\Menu\RadMenuItem.cs:line 1667&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at Telerik.Windows.Controls.RadMenuItem.OnMouseLeftButtonUp(MouseButtonEventArgs e) in c:\TB\117\WPF_Scrum\Release_WPF\Sources\Development\Controls\Navigation\Menu\RadMenuItem.cs:line 1999&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at System.Windows.Input.InputManager.ProcessStagingArea()&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean&amp;amp; handled)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean&amp;amp; handled)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean&amp;amp; handled)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 20 Aug 2013 19:22:48 GMT</pubDate>
      <guid>https://community.esri.com/t5/arcgis-runtime-sdk-for-wpf-retired-questions/grouplayer-layer-pointer-should-be-locked-before/m-p/295036#M1467</guid>
      <dc:creator>BKuiper</dc:creator>
      <dc:date>2013-08-20T19:22:48Z</dc:date>
    </item>
    <item>
      <title>Re: GroupLayer: Layer pointer should be locked before being accessed.</title>
      <link>https://community.esri.com/t5/arcgis-runtime-sdk-for-wpf-retired-questions/grouplayer-layer-pointer-should-be-locked-before/m-p/295037#M1468</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Hi,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Sorry about that - it's a known bug and has been addressed for the 10.2 release.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Cheers&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Mike&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 21 Aug 2013 07:30:57 GMT</pubDate>
      <guid>https://community.esri.com/t5/arcgis-runtime-sdk-for-wpf-retired-questions/grouplayer-layer-pointer-should-be-locked-before/m-p/295037#M1468</guid>
      <dc:creator>MichaelBranscomb</dc:creator>
      <dc:date>2013-08-21T07:30:57Z</dc:date>
    </item>
    <item>
      <title>Re: GroupLayer: Layer pointer should be locked before being accessed.</title>
      <link>https://community.esri.com/t5/arcgis-runtime-sdk-for-wpf-retired-questions/grouplayer-layer-pointer-should-be-locked-before/m-p/295038#M1469</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;... in the meantime there are a couple of workarounds:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;#1. Lock the layer yourself while performing the layer removal:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;
private void RemoveAcceleratedLayer(ESRI.ArcGIS.Client.Layer layer)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; ESRI.ArcGIS.Client.GroupLayerBase container = Container(layer);
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (container != null)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RemoveAcceleratedLayer(layer, container);
&amp;nbsp;&amp;nbsp;&amp;nbsp; else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyMap.Layers.Remove(layer);
}

void RemoveAcceleratedLayer(ESRI.ArcGIS.Client.Layer layer, ESRI.ArcGIS.Client.GroupLayerBase gl)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Type Tds = layer.GetType().Assembly.GetType("ESRI.ArcGIS.Client.DrawingSurface");
&amp;nbsp;&amp;nbsp;&amp;nbsp; var field = Tds.GetField("NativeLayerProperty", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
&amp;nbsp;&amp;nbsp;&amp;nbsp; var dependencyProperty = (DependencyProperty)field.GetValue(null);
&amp;nbsp;&amp;nbsp;&amp;nbsp; var nativelayer = layer.GetValue(dependencyProperty);
&amp;nbsp;&amp;nbsp;&amp;nbsp; var lockprop = nativelayer.GetType().GetProperty("Lock", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
&amp;nbsp;&amp;nbsp;&amp;nbsp; var lockobj = lockprop.GetValue(nativelayer, null);
&amp;nbsp;&amp;nbsp;&amp;nbsp; using (lockobj as System.IDisposable)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gl.ChildLayers.Remove(layer);
}

ESRI.ArcGIS.Client.GroupLayerBase Container(ESRI.ArcGIS.Client.Layer layer)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; return AllLayers(MyMap.Layers).OfType&amp;lt;ESRI.ArcGIS.Client.GroupLayerBase&amp;gt;().FirstOrDefault(gl =&amp;gt; gl.ChildLayers.Contains(layer));
}

System.Collections.Generic.IEnumerable&amp;lt;ESRI.ArcGIS.Client.Layer&amp;gt; AllLayers(System.Collections.Generic.IEnumerable&amp;lt;ESRI.ArcGIS.Client.Layer&amp;gt; layers)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; return layers.Concat(layers.OfType&amp;lt;ESRI.ArcGIS.Client.GroupLayerBase&amp;gt;().SelectMany(glb =&amp;gt; AllLayers(glb.ChildLayers)));
}
&lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;#2. Register an unhandled exception handler, check the exception then flag it as handled.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Implement the handler and check:&lt;/SPAN&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;
private void HandleUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( e.Exception is TargetInvocationException &amp;amp;&amp;amp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Exception.InnerException is NullReferenceException &amp;amp;&amp;amp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Exception.InnerException.StackTrace.Contains("DrawingSurface"))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Handled = true;
}
&lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Register the handler (e.g. in the window constructor):&lt;/SPAN&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;
Application.Current.DispatcherUnhandledException += HandleUnhandledException;
&lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Let me know if you have any trouble with these workarounds.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Cheers&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Mike&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sat, 11 Dec 2021 14:10:32 GMT</pubDate>
      <guid>https://community.esri.com/t5/arcgis-runtime-sdk-for-wpf-retired-questions/grouplayer-layer-pointer-should-be-locked-before/m-p/295038#M1469</guid>
      <dc:creator>MichaelBranscomb</dc:creator>
      <dc:date>2021-12-11T14:10:32Z</dc:date>
    </item>
    <item>
      <title>Re: GroupLayer: Layer pointer should be locked before being accessed.</title>
      <link>https://community.esri.com/t5/arcgis-runtime-sdk-for-wpf-retired-questions/grouplayer-layer-pointer-should-be-locked-before/m-p/295039#M1470</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Thanks, this fix works.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 21 Aug 2013 13:47:58 GMT</pubDate>
      <guid>https://community.esri.com/t5/arcgis-runtime-sdk-for-wpf-retired-questions/grouplayer-layer-pointer-should-be-locked-before/m-p/295039#M1470</guid>
      <dc:creator>BKuiper</dc:creator>
      <dc:date>2013-08-21T13:47:58Z</dc:date>
    </item>
    <item>
      <title>Re: GroupLayer: Layer pointer should be locked before being accessed.</title>
      <link>https://community.esri.com/t5/arcgis-runtime-sdk-for-wpf-retired-questions/grouplayer-layer-pointer-should-be-locked-before/m-p/295040#M1471</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;I can confirm that this is fixed in 10.2&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 09 Feb 2014 19:49:07 GMT</pubDate>
      <guid>https://community.esri.com/t5/arcgis-runtime-sdk-for-wpf-retired-questions/grouplayer-layer-pointer-should-be-locked-before/m-p/295040#M1471</guid>
      <dc:creator>BKuiper</dc:creator>
      <dc:date>2014-02-09T19:49:07Z</dc:date>
    </item>
  </channel>
</rss>

