我有,我有,看起來像這樣的方法的一些UI代碼:避免冗餘異步calcluations
private async Task UpdateStatusAsync()
{
//Do stuff on UI thread...
var result = await Task.Run(DoBunchOfStuffInBackground);
//Update UI based on result of background processing...
}
的目標是爲用戶界面更新相對複雜的計算狀態的任何時間屬性改變了影響其州。這裏有幾個問題:
- 如果我只是從每個更新狀態的地方直接調用此方法,則最終更新狀態可能不正確。假設屬性A改變,然後屬性B改變。即使B在A之後調用UpdateStatusAsync,有時候回調代碼(最終的UI更新)也會以相反的順序發生。因此:(A - >更新) - >(B - >更新) - >(B更新) - >(A更新)。這意味着最終用戶界面顯示一個陳舊的狀態(反映A,但不是B)。
- 如果我總是先等待先前的UpdateStatusAsync完成(我現在正在做的),那麼我可以多次執行昂貴的狀態計算。理想情況下,我只需要對一系列更新進行「最後」計算。
我正在尋找的是一個乾淨的圖案完成以下操作:
- 最終地位不應該超過一個小的時間更多(即我不想讓「過時」 UI與底層狀態不同步)
- 如果在短時間內出現多個更新調用(一種常見用例),我寧願避免重複工作,而是總是計算「最新」更新。
- 由於有幾種情況下可能會在非常接近的時間內(即幾毫秒內)發生多個更新,因此在避免其他更新請求進入時避免啓動處理很方便。
看起來這應該是一個相當普遍的問題,所以我想我會問在這裏是否有人知道這樣做的一個特別乾淨的方式。
是不是這麼簡單:'if(update received){store info;重置100ms定時器}; if(timer expires){do calculation};'? – 2013-03-13 21:42:20
@Scott,類似這樣的東西可能會起作用,儘管它可能會變得非常陳舊(例如,我可以每隔10ms更新一次,例如,在UI狀態開始更新之前需要一整秒) m試圖找到避免冗餘計算和保持UI最新的平衡。 – 2013-03-13 21:47:47
如果你想保持這個一般想法,只需增加一點點複雜性:'if(update received && counter
2013-03-13 22:01:03