我试图用包含配置列表的项目列表填充列表框。
所以我要做的是首先用我的项目列表和所有的子项目填充列表框。一切都进行得很顺利。但是对于每个配置,我需要调用rest服务才能获得状态。因此,我不需要立即发出所有这些请求(首先绑定项目和配置,然后对每个配置进行获取状态,并更新configurations属性异步。但是当我开始加载所有配置(可以达到aprox 200)时,列表框就会冻结。
红色:经过一些思考,当每个listitem (子项目)对用户可见时,最好加载它的状态,但是我找不到任何好的事件。关于如何处理这个问题,有什么建议吗?
这是我的解决方案:
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));
}当完成对rest服务的所有调用时,将立即用所有状态更新列表框。
对我的问题有什么好的解决办法吗?
发布于 2012-02-26 14:42:27
您能在后台循环中添加50 to的等待(thread.Sleep)吗?在我看来,你的列表盒是不断更新的背景威胁。从线程编组+更新UI声明需要资源。通过尽量减少往返次数来优化代码,并且批量更新数据(每10或20项)可以有所帮助。希望这能有所帮助。
https://stackoverflow.com/questions/9340114
复制相似问题