一个有利的结果是阻止这个异常,最好是,或者至少优雅地处理它。
我在 Microsoft 代码中收到异常抛出。最重要的是,抛出异常的方法是 System.Windows.Input.Manipulations.ManipulationSequence.ProcessManipulators
,我在 Microsoft Reference Source 中找不到。
当抛出异常时,我可以在调用堆栈窗口中看到下面一行引用 Windows.Input.Manipulations.ManipulationProcessor2D.ProcessManipulators
, which does exist in Microsoft Reference Source.
但如您所见,它没有名为 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)
看起来好像one other person in the universe有过这个问题,但是根据唯一的评论无法复现。
我有 6 MediaElement
Canvas 上的对象在被操作时都在运行视频,所以我觉得这可能与 CPU 被征税和减速有关,可能使时间戳被乱序发送到方法中(尽管发生了同样的问题使用 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
方法尚未完成,并且从用户输入中再次被命中,是否会发生某种竞争条件,第一个方法命中时 CPU 资源不足而第二个方法运行通过,然后当第一个方法最终完成创建的时间戳是过去吗?- 根据评论,这不太可能。
- 我与同事商量以获得更好的理解。他帮助我意识到我不能从我处理操作事件的方法中吞下异常,因为异常在它到达那里之前发生,在操作数据的实际创建中。因此,我唯一可以处理异常的地方是 App.Main()(我的代码所在的调用堆栈中的第一个位置),这使得优雅地处理它变得更加困难。
最佳答案
我自己也遇到过这个问题。 经过大量测试后,它可以在重负载下用较慢的机器重现。
该应用程序用于数字标牌,显示了许多不同的项目(视频、Html、图像等),还有一些动画。
我不太确定,但它似乎是及时处理输入事件的问题。
对于我自己来说,我可以通过将代码从操作外包到其他异步代码以及在性能方面分析和重写代码来“解决”这个问题。(尽可能缩短在事件内部运行的路径,并尽一切努力稍后也可以使用 Task )
我还向我的应用程序添加了一个异常处理程序来“忽略并记录”这个问题,因为它没有其他影响。
如需更多信息,请随时与我联系。
PS:这是我的第一个回答,所以我希望我写的没问题
关于c# - 与多点触控操作抛出异常相关的未记录的 .NET 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25449170/