c#Parallel Programming,Parallel.for在Epplus中抛出空引用错误

时间:2017-11-24 10:29:48

标签: c# asp.net-mvc validation parallel-processing epplus

我是并行编程的新手。我需要将数据上传到数据库。在上传之前,它涉及三个过程,

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次

任何人都可以帮忙

提前致谢

1 个答案:

答案 0 :(得分:0)

EPPlus不是线程安全的。不声称是。如果资源不是专门为它构建的,那么您不能只是并行访问资源。从一个连续的中获取Excel中的所有数据,然后并行执行您想要执行的操作。