Question Code .NET non documenté relatif aux manipulations de manipulations multiples


Un résultat favorable serait de prévenir cette exception, de préférence, ou du moins de la traiter avec élégance.

Je reçois une exception lancée dans Code Microsoft. En plus de cela, la méthode qui lance l'exception est System.Windows.Input.Manipulations.ManipulationSequence.ProcessManipulators, que je ne trouve pas dans Microsoft Reference Source.

Lorsque l'exception est levée, je peux voir qu'une ligne dans la fenêtre de la pile d'appels fait référence Windows.Input.Manipulations.ManipulationProcessor2D.ProcessManipulators, qui existe dans Microsoft Reference Source.

Mais comme vous pouvez le voir, il ne pas avoir une classe soeur nommée ManipulationSequence.

Quant à l'exception elle-même, c'est un System.Argument.OutOfRangeException avec une valeur de Timestamp values must not decrease. Parameter name: timestamp Actual value was 6590630705479.

La signature pleinement qualifiée de la méthode générant l'exception est System.Windows.Input.Manipulations.ManipulationSequence.ProcessManipulators(long timestamp, System.Collections.Generic.IEnumerable<System.Windows.Input.Manipulations.Manipulator2D> manipulators, System.Windows.Input.Manipulations.ManipulationSequence.ISettings settings)

Il semble que si une autre personne dans l'univers a eu ce problème, mais il ne pouvait pas être reproduit selon le seul commentaire.

J'ai 6 MediaElement des objets sur un canevas qui exécutent tous des vidéos lorsqu'ils sont manipulés, donc j'ai l'impression que cela peut être dû au fait que le processeur est taxé et ralentit, éventuellement en envoyant des horodatages dans la méthode (bien que le même problème se produise en utilisant Image plutôt que MediaElement). L'exception se produit sporadiquement, parfois elle se produit après quelques secondes seulement de manipulation des objets, parfois elle peut durer quelques minutes ou plus pendant que les objets sont manipulés.

Mon code qui fait la manipulation réelle dans ManipulationDelta  ressemble à ça:

//Get current values to manipulate
TransformGroup group = (TransformGroup)element.RenderTransform.Clone();
TranslateTransform translate = (TranslateTransform)group.Children[0].Clone();
ScaleTransform scale = (ScaleTransform)group.Children[1].Clone();
RotateTransform rotate = (RotateTransform)group.Children[2].Clone();

//...does manipulations on each by changing values...

//Apply transformation changes
group.Children[0] = translate;
group.Children[1] = scale;
group.Children[2] = rotate;
element.RenderTransform = group;

j'ai un Storyboard dans XAML jouer avec le RotateTransform, donc je ne peux pas vraiment utiliser MatrixTransform.

Je crée ceci en utilisant WPF avec .NET 4.5.1. L'erreur se produit à la fois dans Windows 8.1 et Windows 7. Avez-vous des idées pour empêcher cette exception?


Quelques réflexions en enquêtant sur le problème:

  • j'ai aussi ManipulationInertiaStarting en jeu ici comme possible cause de cette erreur.
  • Je viens d'ajouter e.Handled = true; à la fin de ManipulationCompleted, qui n'était pas là avant. Je n'ai pas eu l'erreur depuis (bien que, encore une fois, très sporadique, il est donc difficile de dire quand il est fixé).
  • Si un ManipulationDelta La méthode n'est pas encore terminée, et elle est frappée de nouveau par l'utilisateur, pourrait-il y avoir une sorte de situation de concurrence où la première méthode est touchée par les ressources du processeur et la seconde par la suite? est dans le passé?
    • Par un commentaire, ce n'est pas probable.
  • Je me suis entretenu avec un collègue pour mieux comprendre. Il m'a aidé à réaliser que je ne pouvais pas avaler l'exception de mes méthodes qui gèrent les événements de manipulation car l'exception se produit avant qu'elle arrive, lors de la création des données de manipulation. Donc, le seul endroit où je peux gérer cette exception est App.Main () (le premier emplacement de la pile d’appels où mon code existe), ce qui rend le traitement plus facile.

13
2017-08-22 14:18


origine


Réponses:


J'ai eu ce problème exact moi-même. Après de nombreux tests, il pouvait être reproduit avec des machines plus lentes sous forte charge.

L'application était destinée à l'affichage numérique et présentait de nombreux éléments (vidéo, HTML, images, etc.) et comportait également des animations.

Je n'en suis pas certain, mais cela semble être un problème de gestion des événements d'entrée dans le temps.

Pour moi, je pouvais "résoudre" ce problème en externalisant le code de la manipulation à un autre code asynchrone, en passant par le profilage et la réécriture du code de performance. avec une tâche)

J'ai également ajouté un gestionnaire d'exception à mon application pour "ignorer et enregistrer" ce problème, car il n'avait aucun autre impact.

N'hésitez pas à me contacter pour plus d'informations à ce sujet.

PS: c'est ma première réponse ici, alors j'espère que ça va comme je l'ai écrit


1
2018-02-10 08:36



J'ai eu des problèmes similaires lors du développement pour WinRT.

Il est parfois possible d'utiliser DispatcherUnhandledException événement pour ignorer une exception particulière. Pour ce faire, ajoutez un écouteur d'événement, vérifiez si l'exception est celle que vous souhaitez (car il est généralement déconseillé de supprimer toutes les exceptions), puis définissez Manipulé propriété.


0
2018-04-12 23:43