2015-09-30 36 views
3

我正在尋找一種方法來提高我的代碼的性能。我有一個帶有TextBox和圖形的WPF GUI(來自OxyPlot包)。我使用StopWatch查找代碼效率較低的地方,發現更新TextBox文本比填充字符串需要更多時間。例如,如果屬性MyText綁定到文本框,然後這部分代碼的Text屬性C#WPF GUI性能MVVM

Application.Current.Dispatcher.Invoke(()=>{ 
    MyText = currentString; 
}); 

花費的時間要比這一切

StringBuilder sb = new StringBuilder(); 
RetrieveDataFromDevice(); 
FillString(sb); 
string currentString = sb.ToString(); 

而且隨着秒錶:

Task.Factory.StartNew(() => 
{ 
    var sw = new StopWatch(); 
    sw.Start(); 
    StringBuilder sb = new StringBuilder(); 
    RetrieveDataFromDevice(); 
    FillString(sb); 
    string currentString = sb.ToString(); 
    Trace.WriteLine(sw.ElapsedMilliseconds.ToString()); //5ms 
    sw.Restart(); 
    Application.Current.Dispatcher.Invoke(()=>{ 
     MyText = currentString; 
    }); 
    Trace.WriteLine(sw.ElapsedMilliseconds.ToString()); //10ms 
} 

存在性能問題,因爲我不能每15ms更新一次字符串(或圖形)。有什麼方法可以改善這些表演嗎?

+0

爲什麼要更新頻率超過15毫秒的用戶界面?人眼無法感知這樣的頻率。 –

+0

關鍵是我必須禁用GUI更新時,我想要更快運行以供日後分析(因爲我的數據也保存到文件中)。我曾經降低頻率,但由於我希望在數據上看到更快的現象,我試圖減少兩次測量之間的延遲,並且我注意到GUI是瓶頸。解決方案是禁用GUI刷新,但我想探索其他解決方案。謝謝 ! – GuillaumeA

回答

3

嘗試使用Dispatcher.BeginInvoke方法而不是Invoke方法。

此方法不會等待UI線程處理請求,然後才能繼續。它只是將請求放入UI線程的隊列中,然後立即返回。

這將允許您在UI線程處理UI請求時在後臺線程中執行更多處理。儘管如此,應該有合理數量的UI更新請求,您要求UI線程每秒處理一次。

+0

我想知道爲什麼我所有的過程都是同步的......對我來說是恥辱。謝謝 ! – GuillaumeA