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