2010-01-07 2 views
1

Si quelqu'un peut fournir une aide pour celui-ci, je serais très reconnaissant!System.ExecutionEngineException PropertyChanged

Nous utilisons: Silverlight 3/MVVM/Blacklight DragDock Contrôle/ComponentOne Silverlight Contrôle

J'ai une application Silverlight qui repose en grande partie sur le modèle MVVM. L'application fonctionne apparemment bien, jusqu'à récemment. J'ai commencé à remarquer semi-random (semi-random = sur une période de temps assez longue ~ 2 - 5 minutes) Je peux reproduire une exception System.ExecutionEngineException provenant de l'événement PropertyChanged en cours de levée. Le nom de propriété pour lequel la notification est déclenchée n'est pas toujours le même nom de propriété (le déclenchement de l'événement de modification de propriété a lieu dans une classe ViewModel de base).

Le code ressemble fondamentalement ceci:

if (PropertyChanged! = Null) Application.Current.RootVisual.Dispatcher.BeginInvoke (() => PropertyChanged (cela, de nouveaux PropertyChangedEventArgs (propertyName)));

Le code fonctionne pour tout le reste dans l'application. Fondamentalement tout ce qui jette un événement changé de propriété passe par là. Je ne sais pas pourquoi cela échoue tout à coup. S'il vous plaît jeter quelques pensées à ma façon.

J'ai été jusqu'aux genoux dans windbg essayant d'obtenir une certaine emprise sur ce qui se passe, et encore très peu. Je serais heureux de fournir une décharge ou toute autre information qui pourrait être utile. De toute évidence, il y a très peu d'informations données de cette erreur particulière ...

Merci à l'avance, David Justice

+0

Merci à tous pour les réponses. Je pense que nous avons réduit la recherche à un problème dans un contrôle d'arborescence tiers qui jetait une base d'exception interne sur un problème de suivi des éléments sélectionnés dans l'arborescence après le tri de la collection sous-jacente. La partie merveilleuse de l'erreur est qu'elle s'est manifestée de deux manières différentes.Un, il explose sur la propriété changée lorsque l'élément sélectionné n'est pas modifié, mais un autre enfant de l'arbre est changé, puis un événement observé de collection observable est déclenché. La seconde était une exception d'index hors plage lorsque l'élément sélectionné est modifié. – Justice

Répondre

0

Une question que vous pourriez vous demander: est-ce ExecutionEngineException passe dans IE uniquement et, par exemple, pas dans FireFox?

Je sais Silverlight est censé être indépendant du navigateur, mais je l'ai déjà rencontré un connu Similar problème de Silverlight qui a eu lieu au hasard dans IE uniquement.

Le fait que vous obtenez un ExecutionEngineException pointe que le moteur d'exécution SL explose pour une raison quelconque.

+0

Merci pour l'idée. Je testais seulement dans firefox, et j'avais vraiment pensé à le tester dans c.-à-d. B/c j'ai supposé l'indépendance d'exécution. Malheureusement, je n'ai vu aucun changement. Je vois encore l'effondrement de l'exécution après une poignée de cycles d'interaction UI. Je sens que je devrais être à la recherche d'une fuite de mémoire possible, ou d'un contrôle de l'interface utilisateur qui est toujours répertorié aux changements de machine virtuelle. J'ai regardé la mémoire et il semble qu'elle nettoie après elle-même car la vue les enlève alors qu'ils sortent du contexte. – Justice

0

Cette exception est assez exotique. Si on se lance, c'est Game Over, 0 Continue pour le CLR. Aucun code managé ne peut capturer cette exception. Quand j'ai couru dedans, c'était le résultat d'un conducteur écrivant dans un tampon qui n'était pas marshalé correctement et qui n'était donc pas épinglé, et le CLR a déplacé le tampon pendant que le pilote écrivait dessus. Il ne se bloque pas instantanément, mais se produit généralement après que la souris a survolé la barre de menus du formulaire (ce qui a probablement entraîné la création et la destruction de nombreux petits objets, ce qui a amené le CLR à exécuter le GC et à compacter le tas géré). Même si l'un de mes threads de travail communiquait avec le pilote, c'était le thread principal qui lançait l'exception, ce qui rendait les choses plus confuses.

assurer que les choses sont marshalés correctement. Si RIEN est renvoyé au code non managé, assurez-vous d'utiliser GCHandle pour épingler les objets.

Questions connexes