Подтвердить что ты не робот

Недокументированный код .NET, связанный с исключением с помощью Multi-Touch Manipulations

Благоприятный результат будет предотвращать это исключение, предпочтительно или, по крайней мере, обрабатывать его изящно.

Я получаю исключение, созданное в коде Microsoft. Кроме того, метод throw исключение составляет System.Windows.Input.Manipulations.ManipulationSequence.ProcessManipulators, который я не могу найти в Microsoft Reference Source.

Когда генерируется исключение, я вижу, что одна строка в окне "Стек вызовов" ссылается на Windows.Input.Manipulations.ManipulationProcessor2D.ProcessManipulators, который существует в Microsoft Reference Source.

Но, как вы можете видеть, у него нет класса sibling с именем ManipulationSequence.

Как и для самого исключения, это System.Argument.OutOfRangeException со значением Timestamp values must not decrease. Parameter name: timestamp Actual value was 6590630705479.

Полностью квалифицированная подпись метода, генерирующего исключение, составляет 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)

Кажется, что другой человек во Вселенной имеет эту проблему, но не может быть воспроизведен в соответствии с единственным комментарием.

У меня есть 6 MediaElement объектов на холсте, где все запущенные видео при манипулировании, поэтому я чувствую, что это может иметь какое-то отношение к тому, что ЦПУ облагается налогом и замедляется, возможно, чтобы временные метки были отправлены в метод (хотя такая же проблема возникает при использовании Image, а не MediaElement). Исключение случается спорадически, иногда это происходит через несколько секунд после того, как он обменивается данными с объектами, иногда это может продолжаться несколько минут или больше, чтобы манипулировать объектами.

Мой код, который выполняет фактические манипуляции внутри ManipulationDelta, выглядит следующим образом:

//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;

У меня есть Storyboard при использовании XAML с RotateTransform, поэтому я не могу использовать MatrixTransform.

Я создаю это, используя WPF с .NET 4.5.1. Ошибка возникает как в Windows 8.1, так и в Windows 7. Любые идеи о том, как предотвратить это исключение?


Некоторые мысли, когда я исследую проблему:

  • У меня также есть ManipulationInertiaStarting игра здесь как возможная причина этой ошибки.
  • Я только что добавил e.Handled = true; в конец ManipulationCompleted, которого раньше не было. У меня нет ошибки с тех пор (хотя, опять же, очень спорадически, поэтому трудно определить, когда она исправлена).
  • Если метод ManipulationDelta еще не завершен, и он снова попадает из пользовательского ввода, может ли быть какое-то состояние гонки, в котором происходит первый метод, голодает для ресурсов ЦП, а второй проходит, а затем первый метод, наконец, завершает создание временной метки в прошлом?
    • В комментарии это маловероятно.
  • Я посоветовался с коллегой, чтобы получить лучшее понимание. Он помог мне понять, что я не могу усвоить исключение из моих методов, которые обрабатывают события манипуляции, потому что исключение происходит до того, как оно туда попадет, при фактическом создании данных манипуляции. Таким образом, единственным местом, где я могу справиться с этим исключением, является приложение App.Main() (первое место в стеке вызовов, где мой код существует), что делает обработку его изящно еще более трудной.
4b9b3361

Ответ 1

У меня была эта точная проблема. После многих испытаний его можно было воспроизвести с более медленными машинами при большой нагрузке.

Приложение предназначено для Digital Signage и показывало множество разных элементов (видео, HTML, изображения и т.д.), а также некоторые анимации.

Я не уверен в этом, но, похоже, проблема обработки входных событий во времени.

Для себя я мог бы "решить" эту проблему с использованием кода аутсорсинга от асинхронного манипулирования к другому коду, а также профилировать и переписать код по производительности (сократил путь для запуска внутри события как можно больше и сделал все необходимое для сделайте также позже с помощью Задачи)

Также я добавил обработчик Exception в мое приложение, чтобы "игнорировать и регистрировать" эту проблему, потому что это не имело другого влияния.

Не стесняйтесь обращаться ко мне за дополнительной информацией об этом.

PS: это мой первый ответ здесь, поэтому я надеюсь, что все в порядке, как я написал его

Ответ 2

У меня были аналогичные проблемы при разработке для WinRT.

Иногда можно использовать DispatcherUnhandledException событие, чтобы игнорировать одно конкретное исключение. Чтобы сделать это, добавьте прослушиватель событий, проверьте, не является ли исключение одним из них (потому что в целом это плохая идея, чтобы подавить все исключения), а затем установите Handled.