I am facing some problem in parallel.foreach which is "Index was outside the bounds of the array". I am attaching some code for parallel.foreach and where it is crashing.
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;
It is crashing at third last line "lstItemAccount.Add(account)". When I saw in lstItemAccount, It has some counts and in base section it has a error "base {System.SystemException} = {"Source array was not long enough. Check srcIndex and length, and the array's lower bounds."}".
What is the solution of this error?
I would use a ConcurrentBag<T>
instead of List<T>
. List<T>
is designed for only one thread's access.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With