2012-02-18 11 views
2

設定リストを含むプロジェクトリストをリストボックスに入力しようとしています。リストボックスをサブ項目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));                      

    } 

すべての休憩サービスの呼び出しが完了すると、リストボックスはすべてのステータスを一度に更新されます。

誰かが私の問題の解決策をお探しですか?

+0

async ctp 3をチェックすると、いくつかの例が得られます。 –

+0

CTP 3はうまく見えますが、それは私を助けません! CTPはすべてのコールバックやものをラップしますが、私のコードではまだ間違っています。 –

+0

タスクを使用してバックグラウンドでListBoxを設定する例がありますが、これは役に立つかもしれないと思いました。 –

答えて

0

バックグラウンドループに50msの待機(thread.Sleep)を追加できますか?あなたのリストボックスは、バックグラウンドの脅威によって継続的に更新されているようです。スレッドからマーシャリング+ UI要求の更新にはリソースが必要です。往復の回数を最小限に抑えてコードを最適化し、バッチ更新データ(10または20個のアイテムごと)を使用すると役立ちます。お役に立てれば。