2012-02-18 60 views
2

我試圖用包含配置列表的項目列表填充列表框。使用子項異步填充列表框,使列表框凍結

所以我想要做的是先填充我的項目列表和所有子項目列表框。這一切都很順利。但是對於每個配置,我需要調用休息服務才能獲得狀態。所以我不想一次完成所有的請求(首先綁定項目和配置,然後爲每個配置獲取狀態,並且配置狀態屬性更新爲異步,但是當我開始加載所有配置時(可以達到aprox 200)列表框凍結

RED:經過一番思考,應該更好地加載每個listitem(subitem)的狀態,當它對用戶可見時,但我找不到任何好事件。 ?如何處理這種

這裏是我的解決方案:

MainViewModel 
//Fired on pageLoad 
_projectRepository.FindBy(_serverCityConfiguration, BuildListBoxGroups); 


    private void BuildListBoxGroups(IEnumerable<Project> projects) 
    { 
     var projectGroups = new List<ListBoxGroup<BuildConfigurationModel>>(); 

     foreach (Project project in projects) 
     { 
      var buildConfigurations = project.BuildConfigurations.Select(buildConfiguration 
       => new BuildConfigurationModel(buildConfiguration.Id, buildConfiguration.Name, new List<BuildModel>())).ToList(); 
      projectGroups.Add(new ListBoxGroup<BuildConfigurationModel>(
       new ProjectModel(project.Id, project.Name), buildConfigurations)); 
     } 
     Deployment.Current.Dispatcher.BeginInvoke(() => 
                Projects = projectGroups.ToObservableCollection()); 

     //It's here my problem starts, where my listbox freezes 
     ThreadPool.QueueUserWorkItem(FireBuildsFetching, projects); 

    } 

    private void FireBuildsFetching(object stuff) 
    { 
     var projects = stuff as IEnumerable<Project>; 
     foreach (var project in projects) 
     { 
      foreach (var buildConfiguration in project.BuildConfigurations) 
      { 
       ThreadPool.QueueUserWorkItem(RetrieveBuils, buildConfiguration); 
      } 
     } 
    } 

    private void RetrieveBuils(object buildConfiguration) 
    { 
     Debug.WriteLine("RetrieveBuils"); 
     var localBuildConfig = buildConfiguration as BuildConfiguration; 

     //Here is some logic to find correct buildconfiguration to add status to 
     ... 
     Deployment.Current.Dispatcher.BeginInvoke(() => 
          buildConfigurationModel.AddBuilds(buildModels));                      

    } 

當所有呼叫休息服務完成後,列表框會一次更新爲所有狀態。

有人對我的問題有什麼好的解決方案嗎?

+0

看看異步ctp 3,這些例子可能會給你一些想法。 – 2012-02-21 02:49:43

+0

那麼CTP 3看起來不錯,但它不會幫助我!? CTP只是包裝所有的回調和東西,在我的代碼中仍然有問題。 – 2012-02-21 05:56:31

+0

有一個使用任務在後臺填充ListBox的例子,我認爲這可能有所幫助。 – 2012-02-21 14:44:28

回答

0

你可以添加一個50ms的等待(thread.Sleep)到你的後臺循環。對我來說,你的列表框不斷被背景威脅更新。從線程進行編組+更新UI聲明需要資源。通過減少往返次數和批量更新數據(每10或20個項目)優化您的代碼可以提供幫助。希望這可以幫助。