2012-08-15 52 views
4

我希望能夠在C#項目中創建幾百個winrt控件實例(一個搜索結果控件)。問題是,這樣做需要很長時間(十分之一秒或更差),並且必須在UI線程上完成,從而導致失速並顯示結果延遲。高效地創建一個winrt地鐵控件的許多實例

現在我已經繞過這個問題,在啓動過程中預先緩存了許多控件實例。這種方法很有效,但會影響啓動時間(分析顯示啓動附近的處理器時間的40%用於緩存這些控制)並創建要管理的細節,如緩存的大小。

我認爲問題在於,每次控制實例化時,冗餘工作(如重新解析XAML)都由底層框架完成。也許有一種方法可以避免重複這項工作?也許我可以廉價克隆現有的控制?有沒有人有想法?

+0

你有沒有找到一種方法來做到這一點? – 2013-12-18 17:51:32

+0

@joe_coolish我最終實現了自己的UI虛擬化。我在下面添加了自己的答案。 – 2013-12-18 18:07:02

回答

1

前言:已經有一段時間了,微軟可能已經修復了win8應用程序用戶界面虛擬化。我沒有檢查過。

當時我最終做的只是將自己的用戶界面虛擬化整合到一起來解決問題。基本上:緩存控件並重新使用它們來顯示可查看的數據(使用二叉查找樹來有效地查詢可以看到的內容)。我寫了一個blog post about it

+0

感謝您的快速響應! – 2013-12-18 18:10:07

1
  • 您可以在並行線程中執行預緩存。將減少對多核處理器啓動時間的影響

  • searchresult.memberwiseclone將爲您提供淺拷貝。它可能會更快,不確定

  • 你可以只使用一個searchresult並在使用前用正確的數據填充它嗎?在這種情況下,沒有必要創造很多。只需使用一個作爲可重複使用的容器。

  • 如果添加控件父窗體時的時間都花在你可以使用

    • suspendlayout/resumelayout(這是Win32)
    • 設置家長看不見的,回到可見當您完成
  • 有沒有另一種方法可以更快地做同樣的事情? (競爭控制,3D派對等)

+0

1)無法安全地在非UI線程中構造控件。但是,我確實會在每個事件之後讓步,以便讓其他事情前進。 2)沒有MemberwiseClone功能? 3)我需要展示很多。這實質上是大小爲1的預緩存策略。4)在添加到任何內容之前,時間花在控件的構造函數中,所以我不希望佈局成爲問題。 – 2012-08-20 17:34:08

+0

2)在.NET中基於Object的方法列出本來期望它 – IvoTops 2012-08-21 07:11:39

+0

WinRT不包括整個框架。 – 2012-08-21 07:46:47