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));
}
当所有呼叫休息服务完成后,列表框会一次更新为所有状态。
有人对我的问题有什么好的解决方案吗?
看看异步ctp 3,这些例子可能会给你一些想法。 – 2012-02-21 02:49:43
那么CTP 3看起来不错,但它不会帮助我!? CTP只是包装所有的回调和东西,在我的代码中仍然有问题。 – 2012-02-21 05:56:31
有一个使用任务在后台填充ListBox的例子,我认为这可能有所帮助。 – 2012-02-21 14:44:28