Потеря данных о выполнении Hangfire

У меня есть задание зависания, которое теряет данные из 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); 
        }
    }

person JSON    schedule 05.09.2017    source источник
comment
Проверьте, как сериализация Newtonsoft.Json работает с LinkedList ‹ScanLineDTO› и ScanLineDTO. docs.hangfire.io/en/latest/background-methods/   -  person WithMetta    schedule 05.09.2017
comment
В LinkedList известны проблемы с сериализацией.   -  person WithMetta    schedule 05.09.2017
comment
Я думаю, что Hangfire выполняет сериализацию / десериализацию автоматически. Я попытался сериализовать объект перед передачей параметра в Hangfire, а затем десирализировать во время выполнения, как вы предложили. В сериализованной строке json также хранятся пустые объекты. Я думаю, что данные теряются во время сериализации   -  person JSON    schedule 05.09.2017
comment
Итак, вы говорите, что мне нужно использовать что-то помимо связанного списка. Я не уверен, почему первоначальный автор все равно использовал связанные списки. Я не вижу пользы в нашем сценарии   -  person JSON    schedule 05.09.2017
comment
Скорее всего, это решит вашу проблему. Другой вариант - создать новый тип, который является копией ExternalScanDTO, но использует список вместо LinkedList. Затем вам нужно будет преобразовать объекты ExternalScanDTO в этот новый тип перед сериализацией и изменить весь код, который использует десериализованные объекты ExternalScanDTO, в этот новый тип. Если вы хотите стать действительно умным, вы можете создать производный тип ExternalScanDTO с этим новым свойством List, которое перестраивает LinkedList по мере заполнения или создания списка.   -  person WithMetta    schedule 05.09.2017
comment
Немного поиска в Google показывает, что списки тоже не работают. Ни то, ни другое не сериализуемы. Мне нужно было бы использовать сериализуемый объект   -  person JSON    schedule 05.09.2017
comment
Имейте в виду, что сериализация выполняется с помощью Newtonsoft.Json. Списки сериализуемы / десериализуемы с помощью этой библиотеки.   -  person WithMetta    schedule 05.09.2017
comment
Пробовал, возвращает те же результаты   -  person JSON    schedule 05.09.2017