設定リストを含むプロジェクトリストをリストボックスに入力しようとしています。リストボックスをサブ項目asyncで塗りつぶすとリストボックスがフリーズします
私がしようとしているのは、まずプロジェクトリストとすべてのサブアイテムでリストボックスを埋めることです。これはすべて順調です。しかし、それぞれの設定については、ステータスを取得するために休憩サービスを呼び出す必要があります。だから私は一度にすべての要求を行うことを望んでいない(最初のプロジェクトと設定をバインドし、各設定フェッチのステータスのために設定ステータスプロパティを非同期に更新する。)しかし、すべての設定をロードするとき(aprox 200まで)
赤:いくつかの考えの後で、各リストアイテム(サブアイテム)がユーザーに見えるようになるとステータスを読み込むほうがよいはずですが、私はこれに対して良いイベントは見つかりません。 ?
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));
}
すべての休憩サービスの呼び出しが完了すると、リストボックスはすべてのステータスを一度に更新されます。
誰かが私の問題の解決策をお探しですか?
async ctp 3をチェックすると、いくつかの例が得られます。 –
CTP 3はうまく見えますが、それは私を助けません! CTPはすべてのコールバックやものをラップしますが、私のコードではまだ間違っています。 –
タスクを使用してバックグラウンドでListBoxを設定する例がありますが、これは役に立つかもしれないと思いました。 –