2013-01-15 54 views
0

在我的WPF應用程序中,我有一個數據網格,其中填充了一個ObservableCollection集合。假設我在網格中有這樣的10個學生數據。每個學生都有能力做2個長時間運行的作業或過程,並將過程的狀態更新回網格。我想同時做這兩個過程。所以我使用了Task和Parallel.Invoke方法。工作流程如下。並行進程未更新WPF收集列表

  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個項目的最後學生數據。

它不更新網格中的確切學生對象。我的代碼有什麼問題?

在這種情況下的任何幫助???

回答

0

這裏的問題是你從另一個線程引用一個UI控件。您應該創建一個網格可以用作DataSource的內存數據結構(任何實現IEnumerable的內容)。我建議使用ConcurrentBag數據結構進行並行化代碼(http://msdn.microsoft.com/en-us/library/dd997305.aspx)。一旦更新了ConcurrentBag中的每個學生記錄,就可以將網格的數據源設置爲該包。