地图控制Gmap.net 崩溃
-
21-12-2019 - |
题
我正在使用gmap.net 我的winform应用程序中的地图控件。它在开发人员计算机上运行良好,但在客户端计算机上崩溃,尽管我们更新了所有系统。但几分钟后,地图崩溃并给出以下net framework错误
解决方案
我用过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 讨论论坛 顺便说一句。
其他提示
用户版本可能缺少特定的Windows表单DLL,也可以作为Core.dll,这取决于已安装到用户PC上的Visual Studio或打包的.NET应用程序的用户版本。如果不是这种情况,最好寻求GMAP论坛的帮助。
MyMap.HoldInvalidation = True
'
' Add markers or polygons now
'
MyMap.HoldInvalidation = False ' Not sure if this line is needed
MyMap.Refresh()
. 您缺少运行应用程序所需的DLL,我建议在本地系统上复制完整的bin文件夹,然后尝试运行该应用程序。如果您已创建MSI包,则确保正确添加依赖项。