2012-02-18 30 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个项目)优化您的代码可以提供帮助。希望这可以帮助。