2013-11-27 35 views
10

"インデックスが配列の境界外でした"というparallel.foreachの問題に直面しています。私はparallel.foreachのコードと、クラッシュしている場所を添付しています。Parallel.Foreachエラー "インデックスが配列の境界外にありました"

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; 

最後の3行目の「lstItemAccount.Add(account)」にクラッシュしています。 lstItemAccountで見たときにいくつかカウントがあり、ベースセクションにエラーがあります"base {System.SystemException} = {"Source array was not long enough. Check srcIndex and length, and the array's lower bounds."}".

このエラーの解決方法を教えてください。

+0

fyi - あなたは 'lstItemAccount'でスレッドの問題があるかもしれません。 –

+0

この質問の答えはありましたか? –

答えて

8

それはスレッドセーフではありません

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

リストと配列に関係しています。代わりにConcurrentBagを使用してください。

22

List<T>の代わりにConcurrentBag<T>を使用します。 List<T>は、1つのスレッドのアクセス用に設計されています。

+0

ありがとう、ダニエル。今はうまくいきます。 –

+0

これは答えとしてマークする必要があります。 – garenyondem

関連する問題