2010-08-17 66 views
0

我在使用後臺工作人員創建我的對象模型時遇到了麻煩。如何從backgroundWorker線程創建通用控件?

據我瞭解爲什麼,我無法找到解決方法。

這裏是僞邏輯:

  • 呼叫web服務異步

  • 接收。當,在Load方法背景

  • 打開背景工人,和數據裝載到控制,搜索現有對象,如果找不到,則創建一個新對象。

所有創建的對象都從Control繼承(具有透明抽象層)。

雖然我在主線程創建控件,功能,做工精細:

public static T Find<T>(ObservableCollection<T> collection, int objectId) 
     where T : FormaliteBaseControl, new() 
    { 
     foreach (T item in collection) 
     { 
      if (item.ObjectId == objectId) 
       return item; 
     } 

     return new T(); 
    } 

當然,從後臺線程調用時,一個跨線程異常的「新T()」 發生在Silverlight ,無法同步調用Dispatcher.Invoke。

雖然我以這種方式創建了大約450個對象,但我希望將對象模型創建保留在後臺而不會降低Thread.Sleep或其他「好」方法的性能。

感謝您的回答。

+0

將450個UI控件放入什麼類型的容器?一個ItemsControl或列表框?什麼是虛擬化? – WiredPrairie 2010-08-17 12:22:16

+0

由於您使用的是線程,因此您可能會遇到與您正在使用的集合有關的問題 - 如果您是從另一個線程修改集合(而另一個線程正在使用枚舉器,則通過foreach)。 – WiredPrairie 2010-08-17 12:23:39

回答

0

您是否正在創建實際的UI控件?這就是我所暗示的。如果是這樣的話,將它委託給後臺線程似乎沒有意義。爲什麼?因爲最終都是UI對象,所以它們必須在UI線程上創建。我知道你擔心封鎖,但是你的所有主要工作都必須被整理回UI。

可能最好的情況是提供一個pub/sub模型。您可以將具有邏輯的線程產生到後臺線程,但永遠不會實例化一個對象。相反,它會發布請求。在UI線程上,您可以偵聽並創建對象。無效擴展(Rx)對此特別有用,因爲您可以將ObservableCollection轉換爲Observable,然後將迭代集中到UI。

0

謝謝你們倆。

我的控件構建了一個樹形圖。 實際上,根對象包含4個擴展器,其中有一個itemcontrol作爲子項(包含45個對象)。這些子對象中的每一個都有一個帶有itemscontrol的擴展器,有大約10個孩子。

@WPCoder:作爲ItemsControl的很少包含10點以上的對象,很少45,因爲項目可以有多個高度和兒童,虛擬化did'nt幫我(是的,我已經試過)

經過一些測試後,我發現這是花時間的模板步驟。我的對象聲明適合在第二個。所以我使用了一種解決方法來保持第一個深層對象在對象模型變大時摺疊。 用戶保持在啓動時強制擴展的可能性作爲參數,但他們知道這種方法的後面。

@Jeremy,我想MVVM是實現您的解決方案的最佳解決方案? 我會閱讀Reactive Extensions。謝謝。