2013-11-27 16 views
10

Tôi đang đối mặt với một số vấn đề song song.foreach là "Chỉ số nằm ngoài giới hạn của mảng". Tôi đính kèm một số mã cho parallel.foreach và nơi nó đang bị rơi.Parallel.Foreach đưa ra lỗi "Chỉ số nằm ngoài giới hạn của mảng"

var lstFRItems = session.CreateCriteria<TFRItem>().Add(Restrictions.Eq("TSCEnterprise.FEnterpriseID", EnterpriseId)).AddOrder(Order.Asc("FName")).List<TFRItem>(); 
        List<FRItemAccount> lstItemAccount = new List<FRItemAccount>(); 
        var ListAccounts = session.CreateCriteria<TFRItemAccount>().List<TFRItemAccount>(); //lstFRItems.Select(i => new { i.TFRItemAccounts }).ToList(); 
        //foreach (var item in lstFRItems) 
       Parallel.ForEach(lstFRItems, item => 
       { 
        var lstItemAcc = ListAccounts.Where(i => i.TFRItem == item); //item.TFRItemAccounts.ToList(); 
        FRItemAccount account = new FRItemAccount(); 
        account.ItemID = item.FItemID; 
        account.ItemAccount = new List<ItemAccount>(); 
        // foreach (var itemAcct in lstItemAcc) 
        Parallel.ForEach(lstItemAcc, itemAcct => 
        { 
         ItemAccount oItemAccount = new ItemAccount(); 
         if (itemAcct != null) 
         { 
          oItemAccount.ItemAccountID = itemAcct.FItemAccountID; 

          if (itemAcct.TSCProperty == null) 
          { 
           oItemAccount.ForID = itemAcct.TSCCompany.FCompanyID; 
           oItemAccount.ForCompanyName = "Co# " + "- " + itemAcct.TSCCompany.FID + " " + itemAcct.TSCCompany.FName; 
           oItemAccount.FID = itemAcct.TSCCompany.FID; 
           oItemAccount.ForType = 1; 
          } 
          else 
          { 
           oItemAccount.ForID = itemAcct.TSCProperty.FPropertyID; 
           oItemAccount.ForCompanyName = "Prop# " + "- " + itemAcct.TSCProperty.FID + " " + itemAcct.TSCProperty.FName; 
           oItemAccount.FID = itemAcct.TSCProperty.FID; 
           oItemAccount.ForType = 2; 
          } 
          oItemAccount.Account = itemAcct.FAccount; 
          account.GLAccount = itemAcct.FAccount.ToString("#0.000"); //Formatted by Lhore Bansal 
          // account.Account = itemAcct.FAccount; 
          oItemAccount.isExisting = true; 
          //Original TFRItemAccount 
          oItemAccount.orgItemAccount = itemAcct; 
         } 
         if (lstItemAcc == null) 
          account.ItemID = item.FItemID; 
         account.ItemAccount.Add(oItemAccount); 
        }); 
        //Original tFRItem 
        account.Item = item; 
        //account.BaseAccount = Convert.ToDouble(item.FBaseAccount.ToString("F0")); // commented by jeet 
        account.BaseAccount = Convert.ToDouble((int)item.FBaseAccount); // added by jeet 
        account.Name = item.FName; 
        account.Type = item.FType; 
        lstItemAccount.Add(account); 
       }); 
        // tx.Commit(); 
        return Item = lstItemAccount; 

Nó đang rơi ở dòng cuối cùng thứ ba "lstItemAccount.Add (tài khoản)". Khi tôi thấy trong lstItemAccount, nó có một số đếm và trong phần cơ sở nó có lỗi "base {System.SystemException} = {"Source array was not long enough. Check srcIndex and length, and the array's lower bounds."}".

Giải pháp của lỗi này là gì?

+0

fyi - bạn có thể gặp vấn đề về luồng với 'lstItemAccount'. –

+0

Bạn có nhận được câu trả lời cho câu hỏi này không? –

Trả lời

8

Nó đã làm với

ListAccounts.Where(i => i.TFRItem == item); 
account.ItemAccount.Add(oItemAccount); 
lstItemAccount.Add(account); 

Lists và Mảng không được chủ đề an toàn. Sử dụng ConcurrentBag thay vì

22

Tôi sẽ sử dụng số ConcurrentBag<T> thay vì List<T>. List<T> được thiết kế để chỉ truy cập một luồng.

+0

Thanks..Daniel.It hiện đang hoạt động tốt. –

+0

Điều này sẽ được đánh dấu là câu trả lời. – garenyondem

Các vấn đề liên quan