簡體   English   中英

WPF:通過綁定更新折線的Points屬性會導致滯后

[英]WPF: Updating Polyline's Points property via binding causes lag

我有一個自定義圖形控件,該控件使用Polyline對象渲染波形。

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

在我的ViewModel中,每隔一小段時間(50-200毫秒),我就會通過DispatcherTimer生成不同的“ LinePoints”集。 綁定工作得非常好,我在視圖上獲得了動畫波形,除了它在用戶界面中造成了明顯的滯后。 例如,當我右鍵單擊“窗口”中的其他內容時,上下文菜單將出現非常滯后的動畫。

當然,我可以將計時器更改為每500ms滴答一次,這樣可以大大減少延遲。 但是,這會使我的圖形顯得草率。 我有什么方法可以將其中一些轉移到另一個線程?

LinePoints說明: LinePoints的生成不是滯后的主要原因。每一代都使用大約1毫秒的執行時間。該值從System.Diagnostics.Stopwatch獲得)

因此,由於計算所有必需點的操作在UI上很繁瑣,因此您應該使用其他Thread來進行計算。 UI Thread應僅負責表示形式,這意味着它應僅分配給定值,而不計算值。

這是4.5框架版本中引入的新的await async keywords理想用例。

為了實現描述的行為,我建議像這樣使用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 ,該Task本質上可能是另一個Thread (如果當前Thread沒有足夠的資源來運行提供的Delegate ,則從ThreadPool收集),它將不會阻塞您當前正在運行的Thread並且在執行完之后將返回一個結果( PointCollection )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM