我正在使用gmap.net 我的winform应用程序中的地图控件。它在开发人员计算机上运行良好,但在客户端计算机上崩溃,尽管我们更新了所有系统。但几分钟后,地图崩溃并给出以下net framework错误enter image description here

有帮助吗?

解决方案

我用过GMap.NET 控制在过去,我遇到了类似的问题。从背景中的大胖子红十字会来看,GMap.NET 控制系统在它的过程中崩溃了。 OnPaint 方法。该 enumeration operation may not execute 抛出的错误通常是由迭代集合时修改集合引起的:这是框架中大多数集合类型不允许的。

在其 OnPaint 方法,该GMap.NET 控件迭代多个集合,其中包括 GMapControl.Overlays 收集及 GMapOverlay.Markers, GMapOverlay.RoutesGMapOverlay.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包,则确保正确添加依赖项。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top