Благоприятный результат будет предотвращать это исключение, предпочтительно или, по крайней мере, обрабатывать его изящно.
Я получаю исключение, созданное в коде 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() (первое место в стеке вызовов, где мой код существует), что делает обработку его изящно еще более трудной.