0

私の WPF アプリケーションには、ObservableCollection コレクションを取り込むデータ グリッドがあります。グリッドにそのような 10 人の学生データがあるとします。各生徒は、2 つの長時間実行される作業またはプロセスを実行でき、プロセスのステータスをグリッドに更新します。これらの2つのプロセスを同時に実行したい。そこで、Task メソッドと Parallel.Invoke メソッドを使用しました。ワークフローは次のとおりです。

  1. グリッドに Student データ コレクションを作成しました。
  2. スタートボタンをクリックしました。
  3. スタートボタンのクリックイベントで、以下のコードを実行しました。

       foreach (Student stud in StudentLists)
        {
            stud.Status = "started..";
            Task.Factory.StartNew(() => StartProcess(stud));
        }
    
  4. StartProcess では、

    Parallel.Invoke(() =>
        {                
            MarkService ms = new MarkService(stud_data); 
            Student s = ms.GetMarkProcess(); // This will return the stud_data in the above line
    
            Student studitem = StudentLists.Where(x => x.RollID == s.RollID).FirstOrDefault(); // find the student in the grid
            if (studitem != null)
            {                    
                studitem.Status = "Mark Got it";  // if find, updating the status
            }
        },                              
    
        () =>
        {
            SentMarks(poll); // this is another method to be executed parallel
        } 
        );
    

10 人の生徒全員のプロセスを実行すると、グリッド内の各生徒は同じデータになりました。または、グリッド内の 2 人または 1 人の生徒だけがステータス「Mark Got it」を示しています。他の行には、「開始済み..」ステータスのみが表示されます。

これがコレクションを更新していない理由。

INotofyPropertyChanged を使用し、プロパティが更新されたときにイベントを発生させました。XAML では、各バインディングは双方向モードで使用されます。

エラーはありません。しかし、学生コレクションの 1 つまたは 2 つのアイテムは、時々更新されています。場合によっては、コレクションに 9 項目すべての最後の生徒のデータが含まれていることがあります。

グリッド内の正確な学生オブジェクトを更新していません。私のコードで何が間違っていますか?

この場合の助けはありますか???

4

1 に答える 1

0

ここでの問題は、別のスレッドから UI コントロールを参照していることです。グリッドが DataSource (IEnumerable を実装するもの) として使用できるインメモリ データ構造を作成する必要があります。並列化されたコードには ConcurrentBag データ構造を使用することをお勧めします ( http://msdn.microsoft.com/en-us/library/dd997305.aspx )。ConcurrentBag 内の各学生レコードを更新したら、グリッドのデータソースをそのバッグに設定します。

于 2013-06-25T15:49:03.237 に答える