我有一个自定义图形控件,它使用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
)
答案 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
)。