我是并行编程的新手。我需要将数据上传到数据库。在上传之前,它涉及三个过程,
1.数据需要验证。
2.需要转换为List。
3.最后它将被转换为另一个Type.i.e Mapping
所以对于这个过程,我使用了并行编程。验证有单独的方法,我们有单独的方法将excel转换为list.This验证方法从Converting方法调用。这个过程应该发生在Concurrently.it正常工作正常loop.But不在Parallel.for.For相同的文件,在某些情况下验证成功发生,在某些情况下,它显示错误
对象引用未设置为对象的实例
此错误仅在验证方法中出现。因为数据可用。
下面我有并行代码
Parallel.For(2, BelieversWorkSheet.Dimension.End.Row, new ParallelOptions { MaxDegreeOfParallelism = BelieversWorkSheet.Dimension.End.Row },rowIterator =>
{
var BelieverCSVs = new BelieversSignupUploadDetails();
if (!string.IsNullOrWhiteSpace(BelieversWorkSheet.Cells[rowIterator, 1]?.Value?.ToString()) || !string.IsNullOrWhiteSpace(BelieversWorkSheet.Cells[rowIterator, 2]?.Value?.ToString()) || !string.IsNullOrWhiteSpace(BelieversWorkSheet.Cells[rowIterator, 3]?.Value?.ToString()) || !string.IsNullOrWhiteSpace(BelieversWorkSheet.Cells[rowIterator, 4]?.Value?.ToString()))
{
var SingeRowValidationSummary = RequiredValidationForARow(BelieversWorkSheet.Cells[rowIterator, 1, rowIterator, 4], rowIterator, BelieversWorkSheet);//Validating Method is called
if (SingeRowValidationSummary.Count==0|| SingeRowValidationSummary==null)//add && decimal.TryParse(BelieversWorkSheet.ToString(), out Stand) && decimal.TryParse(E.ToString(), out Express)
{
BelieverCSVs.FirstName = BelieversWorkSheet.Cells[rowIterator, 1].Value.ToString();
BelieverCSVs.MiddleName = BelieversWorkSheet.Cells[rowIterator, 2].Value.ToString();
BelieverCSVs.LastName = BelieversWorkSheet.Cells[rowIterator, 3].Value.ToString();
BelieverCSVs.DOB = DateTime.Parse(BelieversWorkSheet.Cells[rowIterator, 4].Value.ToString());
Believers.Add(BelieverCSVs);
}
else
{
ValidationSummaryForSingle.AddRange(SingeRowValidationSummary);
}
}
});
以下是发生错误的验证方法。
private List<string> RequiredValidationForARow(ExcelRangeBase CurrentRow,int rowstart,ExcelWorksheet IndexFind)
{
List<string> ValidationMessage=new List<string>();
Regex regex = new Regex(@"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|"+ @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)"+ @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$");
if (string.IsNullOrWhiteSpace(((object[,])CurrentRow?.Value)[0, 0]?.ToString()))
ValidationMessage.Add( "First Name in row\t"+ IndexFind.Cells[rowstart, 1].ToString() +" is Missing" );
if (string.IsNullOrWhiteSpace(((object[,])CurrentRow?.Value)[0, 2]?.ToString()))
ValidationMessage.Add("Last Name in row\t"+ IndexFind.Cells[rowstart, 3].ToString()+" is Missing");
if (string.IsNullOrWhiteSpace(((object[,])CurrentRow?.Value)[0, 5]?.ToString()))
ValidationMessage.Add("Primary Email in row \t" + IndexFind.Cells[rowstart, 4].ToString() + " is Missing" );
else
if (!regex.IsMatch(((object[,])CurrentRow?.Value)[0, 4]?.ToString()))
ValidationMessage.Add("Primary Email in row \t" + IndexFind.Cells[rowstart, 4].ToString() + " is invalid");
return ValidationMessage;
}
注意 - 这个错误不会一直出现。如果我要使用相同的数据上传相同的文件10次,它会显示此错误4次
任何人都可以帮忙
提前致谢
答案 0 :(得分:0)
EPPlus不是线程安全的。不声称是。如果资源不是专门为它构建的,那么您不能只是并行访问资源。从一个连续的中获取Excel中的所有数据,然后并行执行您想要执行的操作。