2

我在我的 winform 应用程序中使用 gmap.net 地图控件。尽管我们更新了所有系统,但它在开发人员计算机上运行良好,但在客户端计算机上崩溃。但几分钟后地图崩溃并给出以下网络框架错误在此处输入图像描述

4

3 回答 3

4

我过去使用过 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 讨论论坛上获得对您的问题更有帮助的答案。

于 2014-06-03T20:51:57.410 回答
0

要解决此问题,您必须在更新或添加标记或多边形时禁用失效:

MyMap.HoldInvalidation = True

'
' Add markers or polygons now
' 

MyMap.HoldInvalidation = False      ' Not sure if this line is needed
MyMap.Refresh()
于 2019-06-20T15:35:53.317 回答
-1

您缺少运行应用程序所需的 dll,我建议您在本地系统上复制完整的 bin 文件夹,然后尝试运行应用程序。如果您创建了 msi 包,请确保正确添加了依赖项。

于 2014-06-03T12:40:56.483 回答