У меня есть задание зависания, которое теряет данные из LinkedList, содержащегося внутри объекта, переданного в качестве параметра.
Пользователь вводит файл с разделителями, который разбирается в объект, сохраняя каждую строку в LinkedList другого объекта. Затем я включаю задание зависания и передаю объект в качестве параметра. Когда задание выполняется, все данные в списке ссылок равны нулю. Список по-прежнему содержит правильное количество элементов, только каждый из них пуст. Любые идеи?
Определение объекта здесь.
public class ExternalScanDTO : BaseDTO
{
[Key]
public int ScanHeaderID { get; set; }
public int? ScannerID { get; set; }
public string DeviceIdentifier { get; set; }
public int? RFIDInputID { get; set; }
//this is the list losing data
[SuppressMessageAttribute("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public LinkedList<ScanLineDTO> ScanLineDTOs { get; set; }
public DbGeography Location { get; set; }
public Guid GlobalUID { get; set; }
public int? UserID { get; set; }
public int StatusCodeRecordTypeID { get; set; }
public string StatusCodeRecordTypeName { get; set; }
}
Я разбираю файл и ставлю задание в очередь
public ActionResult ParseCS4070CSVScanFile([DataSourceRequest] DataSourceRequest kendoRequest, ScanFileImportModel import)
{
try
{
int count = 0;
import.ParsingErrors = new List<ParsingError>();
var parser = new TextFieldParser(import.File.InputStream);
parser.TextFieldType = FieldType.Delimited;
parser.Delimiters = new string[] { "," };
var result = new ExternalScanDTO()
{
ScannerID = import.ScannerID,
StatusCodeRecordTypeID = (int)StatusCodeEnums.ScanHeaderRecordTypes.Barcode,
ScanLineDTOs = new LinkedList<ScanLineDTO>(),
};
// Build parsed list of Scan Lines:
while (!parser.EndOfData)
{
count++;
var rowValues = parser.ReadFields();
if (!isValidScanLine(import, rowValues, count))
continue;
var addedLine = new ScanLineDTO
{
StatusCodeID = (int)StatusCodeEnums.ScanLineStatusCodes.Valid,
StatusCodeScanTypeID = (int)StatusCodeEnums.ScanLineScanType.StandardOrder,
Barcode = rowValues[3],
ScanTimeStamp = DateTime.Parse(rowValues[0] + " " + rowValues[1], CultureInfo.CurrentCulture, DateTimeStyles.AssumeUniversal),
};
addedLine.DateCreated = DateTime.UtcNow;
result.ScanLineDTOs.AddLast(addedLine);
}
if (import.ParsingErrors.Count > 0)
throw new MyException(import.ParsingErrorsToHtml);
if(result.ScanLineDTOs.Count == 0)
throw new MyException("The File does not contains any lines");
// POST LINES TO DATABASE:
var hfj = new HFJScans();
BackgroundJob.Enqueue(() => hfj.ProcessScanValidation(result));
return Content("");
}
catch (Exception ex) {return AjaxErrorMessage(ex);}
}
Задание выполняет этот метод, содержащийся внутри объекта HfjScans, созданного в предыдущем методе, который выполняет некоторые проверки. К этому моменту связанный список содержит пустые элементы.
public void ProcessScanValidation(ExternalScanDTO result)
{
using (var wfOpr = new WFScanUploadValidate())
{
var resultID = wfOpr.Run(result);
}
}