閱讀文檔時,似乎WPF使用反射來綁定CLR對象。在我的應用程序中,我將一個DataGrid
綁定到僅包含250個項目(每個項目有8個屬性)的IList<T>
。 DataGrid
正在使用虛擬化,所以它只能獲取30個左右的屬性。這些屬性都是簡單的字符串,並且仍然需要幾百毫秒,如果將它與通過複雜數據庫查詢生成該列表所花費的40毫秒進行比較,則時間太長。提高綁定速度
是否有任何技巧來提高綁定時間?
閱讀文檔時,似乎WPF使用反射來綁定CLR對象。在我的應用程序中,我將一個DataGrid
綁定到僅包含250個項目(每個項目有8個屬性)的IList<T>
。 DataGrid
正在使用虛擬化,所以它只能獲取30個左右的屬性。這些屬性都是簡單的字符串,並且仍然需要幾百毫秒,如果將它與通過複雜數據庫查詢生成該列表所花費的40毫秒進行比較,則時間太長。提高綁定速度
是否有任何技巧來提高綁定時間?
所以,這是一個猜測,但它發生在我以前,這是值得一試。在猜測之前,你是否分析了你的代碼,看看究竟是哪個調用花費最多時間?我相信你,當你說使用綁定的時候,時間會大大增加,但是我要給出的建議可以被證明或者被分析結果反駁。無論如何...
我前段時間在一個應用程序上工作,生成了很多小UI元素。每個元素都是UserControl
的一個實例,並使用數據綁定來表示它的外觀。我注意到,當生成這些元素中的很多(200+)時,有一個明顯的滯後。
我們使用棱鏡和ViewModelBase
類,在委託傳遞給RaisePropertyChanged
方法,即
private int _foo;
public int Foo
{
get { return _foo; }
set
{
if(_foo != value)
{
_foo = value;
RaisePropertyChanged(this.Foo); // trouble
}
}
}
這樣做的問題是,RaisePropertyChanged
的實現必須使用反射來獲取屬性名稱爲串。當很多(我的意思是很多)這些被解僱的時候,都會有明顯的表現。
解決方案?使用一個字符串而不是函數對象。是的,這只是它所需要的。它有點臭,因爲如果你重構了這個屬性,你必須記住要改變兩件事情,但老實說,在許多情況下性能降低是不值得的。
反正,給它一個鏡頭。如果在RaisePropertyChanged
內部花費大量CPU時間,可能原因很多。
感謝您的想法!但是,所有屬性都是隻讀的,並且永遠不會更改,因此根本不使用「PropertyChanged」。你有什麼建議使用什麼軟件來進行分析?我嘗試了一些,但是從它們中獲得任何有意義的結果似乎非常複雜? – Muis
@Joshua:好吧,對不起,我沒有更多的幫助。我使用Redgate的ANTS分析器獲得了很好的結果。它是免費的2個星期。 –