我在winform应用程序中使用gmap.net Map控件。它在开发人员计算机上运行良好但在客户端计算机上崩溃虽然我们更新了所有系统。但几分钟后,地图崩溃,并提供以下网络框架错误
答案 0 :(得分:4)
我过去使用过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>
的自定义集合类。这个名字意味着线程安全,因此在迭代期间可能容忍修改,但我没有研究它的实现,所以我不确定这是否属实。我的观察似乎表明不是这样,但这是很久以前的事了。
当时,我通过invoking修改上述集合到GUI线程解决了我的问题(缺少同步对象来锁定)。调用确保修改不可能与GMapControl.OnPaint
方法同时运行,{{1}}方法也始终在GUI线程上运行。
至于为什么你没有在你的机器上观察到这种行为:这可能是由于众多原因造成的。也许你很幸运,也许你使用的应用程序与客户端等不同。
顺便说一句,你可以在GMap.NET discussions forum上获得更有用的问题答案。
答案 1 :(得分:0)
用户版本可能缺少特定的Windows窗体DLL以及Core.DLL这取决于用户版本的运行情况,即已安装到用户的Visual Studio或Packaged .NET应用程序PC。如果不是这种情况,最好向GMap论坛寻求帮助。
答案 2 :(得分:0)
要解决此问题,您必须在更新或添加标记或多边形时禁用无效:
MyMap.HoldInvalidation = True
'
' Add markers or polygons now
'
MyMap.HoldInvalidation = False ' Not sure if this line is needed
MyMap.Refresh()
答案 3 :(得分:-1)
您缺少运行应用程序所需的dll,我建议您复制本地系统上的完整bin文件夹,然后尝试运行该应用程序。如果您已创建msi包,请确保正确添加依赖项。