WPF:通过绑定更新折线的点属性导致滞后

时间:2016-05-11 09:52:16

标签: c# wpf multithreading rendering lag

我有一个自定义图形控件,它使用Polyline对象来渲染波形。

<Polyline Name="Line" Points="{Binding LinePoints}"
    Stroke="{Binding LineColor}"
    StrokeThickness="{Binding LineThickness}">

在我的ViewModel中,我将生成不同的&#34; LinePoints&#34;每隔一段时间(50-200ms)通过DispatcherTimer。绑定工作完全正常,我在View中获得动画波形,除了它导致用户界面的显着滞后。例如,当我右键单击窗口中的其他内容时,上下文菜单将显示非常滞后的动画。

当然,我可以将计时器更改为每500毫秒,并且滞后将显着减少。但是,这会让我的图看起来很草率。有什么方法可以将其中一些转移到另一个线程吗?

(旁注:LinePoints的生成不是滞后的主要原因。每一代都使用大约1ms的执行时间。该值来自System.Diagnostics.Stopwatch

1 个答案:

答案 0 :(得分:0)

因此,由于计算所有必需点的操作在UI上很重,因此您应该使用额外的 <system.webServer> <staticContent> <mimeMap fileExtension=".json" mimeType="application/json" /> </staticContent> </system.webServer> 来计算。 Thread应该只负责表示,这意味着它应该只分配给定的值,而不是计算它。

这是UI Thread框架版本中引入的新await async keywords的完美用例。

为了实现所描述的行为,我建议使用4.5

Task class

它是如何运作的?private async void InvokeHandler() { while(true) { // Passes variable to calculation method and waits for result without blocking. ViewModel.Points = await Task.Run(() => CalculatePoints(new object())); await Task.Delay(100); } } private Task<PointCollection> CalculatePoints(object requiredArguments) { var points = new PointCollection(); // Do calculations here with requiredArgument passed from a caller. return Task.FromResult(points); } 方法中,您可以启动InvokeHandler,这可能基本上是另一个Task(从Thread收集当前ThreadPool没有足够的资源来运行Thread},这不会阻止您当前正在运行的Delegate,并且在完成执行后会返回结果(Thread )。