我在我的 winform 应用程序中使用 gmap.net 地图控件。尽管我们更新了所有系统,但它在开发人员计算机上运行良好,但在客户端计算机上崩溃。但几分钟后地图崩溃并给出以下网络框架错误
3 回答
我过去使用过 GMap.NET 控件,也遇到了类似的问题。从后台的大红叉来看,GMap.NET控件在其执行过程中崩溃了OnPaint
。抛出的enumeration operation may not execute
错误通常是由在迭代集合时修改集合引起的:这是框架中大多数集合类型所不允许的。
在其OnPaint
方法中,GMap.NET 控件迭代大量集合,其中包括这些覆盖的GMapControl.Overlays
集合和GMapOverlay.Markers
,GMapOverlay.Routes
和GMapOverlay.Polygons
集合。在我的例子中,我正在从后台线程修改这些集合,而控件正在尝试进行绘制,从而迭代这些集合。这导致了类似于您现在观察到的行为。
我注意到 GMap.NET 使用了一个自定义集合类ObservableCollectionThreadSafe<T>
来调用所有上述集合。这个名字暗示了线程安全,因此可能对迭代期间的修改有容忍度,但我还没有研究过它的实现,所以我不确定这是否属实。我的观察似乎表明并非如此,但这是很久以前的事了。
当时,我通过将上述集合的修改调用到 GUI 线程(由于缺少要锁定的同步对象)来解决我的问题。调用确保修改不可能与方法同时运行,该GMapControl.OnPaint
方法也将始终在 GUI 线程上运行。
至于为什么您没有在您的机器上观察到这种行为:这可能是由于多种原因。也许你很幸运,也许你使用应用程序的方式与客户端不同,等等。
顺便说一句,您可能可以在GMap.NET 讨论论坛上获得对您的问题更有帮助的答案。
要解决此问题,您必须在更新或添加标记或多边形时禁用失效:
MyMap.HoldInvalidation = True
'
' Add markers or polygons now
'
MyMap.HoldInvalidation = False ' Not sure if this line is needed
MyMap.Refresh()
您缺少运行应用程序所需的 dll,我建议您在本地系统上复制完整的 bin 文件夹,然后尝试运行应用程序。如果您创建了 msi 包,请确保正确添加了依赖项。