Question

J'utilise le contrôle gmap.net Map dans mon application Winform.il fonctionne bien sur les ordinateurs des développeurs mais plante sur les ordinateurs des clients. Bien que nous mettions à jour tous les systèmes.mais après quelques minutes, la carte plante et donne l'erreur de structure nette suivanteenter image description here

Était-ce utile?

La solution

J'ai utilisé le contrôle GMap.NET dans le passé et j'ai rencontré un problème similaire.A en juger par la grosse croix rouge en arrière-plan, le contrôle GMap.NET s'est écrasé lors de son OnPaint méthode.Le enumeration operation may not execute L'erreur générée est généralement provoquée par la modification d'une collection lors de son itération :c'est quelque chose que la plupart des types de collections du framework ne permettent pas.

Dans son OnPaint méthode, le contrôle GMap.NET itère de nombreuses collections, entre autres les GMapControl.Overlays la collecte et la GMapOverlay.Markers, GMapOverlay.Routes et GMapOverlay.Polygons collections de ces superpositions.Dans mon cas, je modifiais ces collections à partir d'un thread d'arrière-plan pendant que le contrôle essayait de faire sa peinture, et ainsi d'itérer ces collections.Cela a abouti à un comportement similaire à celui que vous observez actuellement.

J'ai remarqué que GMap.NET utilise une classe de collection personnalisée appelée ObservableCollectionThreadSafe<T> pour l'ensemble de la collection susmentionnée.Le nom implique la sécurité des threads et donc une tolérance possible aux modifications lors de l'itération, mais je n'ai pas étudié son implémentation donc je ne suis pas sûr que cela soit vrai.Mes observations semblaient indiquer le contraire, mais c'était il y a longtemps.

À l'époque, j'ai résolu mes problèmes en invoquer modifications des collections mentionnées ci-dessus dans le thread GUI (par manque d'objet de synchronisation sur lequel se verrouiller).L'invocation garantit que les modifications ne peuvent pas s'exécuter simultanément avec le GMapControl.OnPaint méthode, qui s'exécutera toujours également sur le thread GUI.

Pourquoi vous n’observez pas ce comportement sur votre machine :cela peut être dû à de nombreuses raisons.Peut-être avez-vous eu de la chance, peut-être utilisez-vous l'application différemment du client, etc.

Vous pouvez probablement obtenir des réponses plus utiles à votre question sur le Forum de discussion GMap.NET d'ailleurs.

Autres conseils

La version utilisateur est peut-être manquante de la DLL de formulaire Windows spécifique comme-e-e-e-e-e-e-e-e-ce que cela dépend de ce que la version utilisateur est en cours d'exécution à partir d'une application I.E Visual Studio ou Packaged .NET qui a été installé sur le PC de l'utilisateur.Si ce n'est pas le cas, il peut être préférable de demander de l'aide sur les forums GMAP.

Pour résoudre ce problème, vous devez désactiver l'invalidation tandis que la mise à jour ou l'ajout de marqueurs ou de polygones:

MyMap.HoldInvalidation = True

'
' Add markers or polygons now
' 

MyMap.HoldInvalidation = False      ' Not sure if this line is needed
MyMap.Refresh()

Il vous manque la DLL requise pour exécuter l'application, je suggérerais de copier le dossier BIN complet sur votre système local, puis d'essayer d'exécuter l'application.Si vous avez créé MSI Emballez-les, assurez-vous que la dépendance est ajoutée correctement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top