Почему мой метод вызывается дважды (или более) из Page_Load () - PullRequest
1 голос
/ 06 августа 2020

(Это репост вопроса, который я задавал несколько часов go, в котором не было достаточно подробностей и он был закрыт) * ​​1001 *

У меня есть процедура импорта, которая берет содержимое из файла json и использует JsonConvert.Deserialize () для чтения содержимого в динамическую c переменную, называемую «items». Вот фрагмент кода (кое-что удалено для краткости - эта процедура состоит из 800 строк ....)

Он запускается из события Page_Load следующим образом:


        protected void Page_Load(object sender, EventArgs e)
        {
            
            if (Helpers.RequestString("task") == "importData") // Helpers is a function I have created to sanitize query string input
            {
                ImportData_new(); // this is the process being called
            }
        }

I я добавляю к объекту StringBuilder во время этого процесса, а затем записываю содержимое построителя строк в файл журнала в конце цикла по элементам в json.

Теперь сам метод;

private void ImportData_new()
        {
            _importGroup = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            _logOutput.Clear();
            _logOutput.Append(string.Format("{0}: {1}{2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), "###################### INITIALISING IMPORT ROUTINE #######################", Environment.NewLine));
            //File.AppendAllText(_logPath, _logOutput.ToString());
            var OK = true;

            // Grab the text file contents
            var file_content = "";

            try
            {
                file_content = System.IO.File.ReadAllText(_filePath + "testjson.json");
            }
            catch (Exception e)
            {
                OK = false;
                //_logOutput.Clear();
                _logOutput.Append(string.Format("{0}: {1}{2}{3}################# IMPORT ABORTED #################{3}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), "Import aborted: Unable to read text from text file. Error: ", e.Message, Environment.NewLine));
                File.AppendAllText(_logPath, _logOutput.ToString());
            }
            var file_content = System.IO.File.ReadAllText(_filePath + "testjson.json");
            dynamic items = JsonConvert.DeserializeObject(file_content);
            foreach (dynamic item in items){
                // read values from the "item" dynamic object and use them to create a database record/row
                // Here's one example of the numerous sections I am processing
                var DayNightValue = item["TabA OperationalHours"] != null && item["TabA OperationalHours"].Value != null && item["TabA OperationalHours"].Value != "" && item["TabA OperationalHours"].Value.ToString().Trim() != "" ? item["TabA OperationalHours"].Value.ToString().Trim() : "";
                        if (DayNightValue != "")
                        {
                            if (DayNightValue.ToString().ToLower().StartsWith("day"))
                            {
                                _logOutput.Append(string.Format("{0}: {1}{2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), "Item " + counter + ": Day/Night: Day", Environment.NewLine));
                                hems.DayNightVal = "Day";
                            }
                            if (DayNightValue.ToString().ToLower().StartsWith("night"))
                            {
                                _logOutput.Append(string.Format("{0}: {1}{2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), "Item " + counter + ": Day/Night: Night", Environment.NewLine));
                                hems.DayNightVal = "Night";
                            }
                        }
                        else
                        {
                            hems.DayNightVal = null;
                            _logOutput.Append(string.Format("{0}: {1}{2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), "## WARNING for Item " + counter + ": Day/Night value is empty. Setting as null.", Environment.NewLine));
                        }
                ...process the rest of the properties in the json item
            } // end of the for loop.
}
....<snipped>

В конце процедуры я вывожу информацию журнала в текстовый файл. Файл журнала показывает, что один l oop работает, но до его завершения запускается другой, поэтому в файле журнала отображается информация от одного l oop, смешанного с другим. За один импорт в журнал должно быть записано 3 записи (тестирование только с 3 записями). Но происходит то, что процедура запускает один импорт, но затем, кажется, происходит вторичный импорт - см. Ниже (мои заметки заключены в CAPS, окруженные квадратными скобками). Обратите внимание на неупорядоченную запись строки (см. Отметки времени).

[**IMPORT STARTS**]
2020-08-06 13:18:12: ###################### INITIALISING IMPORT ROUTINE #######################
2020-08-06 13:18:12: 3 rows found.....
2020-08-06 13:18:12: Importing Item 1: Flight Record: xxxx, Mission Date: 4/08/2020 12:00:00 AM, Mission Number: 343, Patient: xxxx
2020-08-06 13:18:12: Item 1: Mission Authorised By Airdesk (Value Yes).
2020-08-06 13:18:12: Item 1: Service Item Code Value: (Supplied: ETA11) Actual ID:6888
2020-08-06 13:18:12: Item 1: Day/Night: Day
2020-08-06 13:18:12: Item 1: Reason for use of Helicopter (Value: Multi reasons), actual ID: 8.
2020-08-06 13:18:12: Item 1: Mission Type Value: (Supplied: Pre Hospital Trauma) Actual ID:6906
2020-08-06 13:18:12: Item 1: Patient Outcome Value: (Supplied: Life saved) Actual ID:7134
[**......SNIPPED SOME OF THE ROWS**]
[**LOG GOES THROUGH FIRST ITEM IN IMPORT BUT THEN INSTEAD OF SHOWING THE NEXT TWO ITEMS, SHOWS THE FINISHED NOTIFICATION**]
2020-08-06 13:18:12: ############ IMPORT FINISHED ############
[**THEN SHOWS ANOTHER ONE STARTING - NOTE IT SAYS "Item 1" again...**]
2020-08-06 13:18:12: ###################### INITIALISING IMPORT ROUTINE #######################
2020-08-06 13:18:12: 3 rows found.....
2020-08-06 13:18:12: Importing Item 1: Flight Record: 5676, Mission Date: 4/08/2020 12:00:00 AM, Mission Number: 343, Patient: xxxx
2020-08-06 13:18:12: Item 1: Mission Authorised By Airdesk (Value Yes).
2020-08-06 13:18:12: Item 1: Service Item Code Value: (Supplied: ETA11) Actual ID:6888
2020-08-06 13:18:12: Item 1: Day/Night: Day
[**......SNIPPED SOME OF THE ROWS - SAYS IT'S FINISHED AFTER 1 ITEM AGAIN**]
2020-08-06 13:18:12: ############ IMPORT FINISHED ############
[**NOW THE TIME IN THE LOG CHANGES TO 27 SECONDS AFTER THE IMPORT STARTED - BUT THIS TIME SEEMINGLY STARTING ON Item 2**]
2020-08-06 13:18:29: Importing Item 2: Flight Record: 5678, Mission Date: 4/08/2020 12:00:00 AM, Mission Number: 474, Patient: xxxx
2020-08-06 13:18:29: Item 2: Mission Authorised By Airdesk (Value Yes).
2020-08-06 13:18:29: Item 2: Service Item Code Value: (Supplied: METAT11) Actual ID:6902
2020-08-06 13:18:29: Item 2: Day/Night: Night
[**......SNIPPED SOME OF THE ROWS**]
[**FINISHES AFTER ITEM 2 THIS TIME**]
2020-08-06 13:18:29: ############ IMPORT FINISHED ############
2020-08-06 13:18:12: ###################### INITIALISING IMPORT ROUTINE #######################
2020-08-06 13:18:12: 3 rows found.....
[**IMPORT STARTS AGAIN - AND NOTE THE TIME STAMP HAS GONE IN REVERSE**]
[**FINISHES AGAIN AFTER ONLY ONE ITEM**]
2020-08-06 13:18:12: ############ IMPORT FINISHED ############
[**NOTE THE TIME HAS CHANGED YET AGAIN**]
2020-08-06 13:18:29: Importing Item 2: Flight Record: 5678, Mission Date: 4/08/2020 12:00:00 AM, Mission Number: 474, Patient: xxxx
2020-08-06 13:18:29: Item 2: Mission Authorised By Airdesk (Value Yes).
2020-08-06 13:18:29: Item 2: Service Item Code Value: (Supplied: METAT11) Actual ID:6902
2020-08-06 13:18:29: Item 2: Day/Night: Night
2020-08-06 13:18:29: Item 2: Reason for use of Helicopter (Value: Time), actual ID: 3.
2020-08-06 13:18:29: Item 2: Mission Type Value: (Supplied: IHT) Actual ID:6908
2020-08-06 13:18:29: Item 2: Patient Outcome Value: (Supplied: Further complications avoided) Actual ID:6973
[**CONTINUES TILL DONE - BUT ERRORS ON THE BROWSER PAGE AS IT WOULD SEEM THAT TWO THREADS ARE ATTEMPTING TO OPEN THE LOGGING TXT FILE AT ONCE**]

Итак, похоже, что действительно есть по крайней мере два (возможно, больше, если смотреть на журнал как признак), выполняющих ImportData_new () метод. Может быть здесь проблема с Page_Load? Это единственный процесс, вызывающий метод.

Клифф

1 Ответ

0 голосов
/ 04 сентября 2020

На всякий случай кто-нибудь в будущем это увидит. Вот в чем была моя проблема.

  1. Я использовал встроенный веб-сервер Visual Studio (Cassini)
  2. Я использовал переменную 'Dynami c' для чтения JSON данные, которые я получал, а затем перебирал этот динамик c
  3. Я изменил отладчик на использование IIS вместо Cassini. Это на мгновение устранило проблему (я понимаю, что у Cassini меньше места для выделения памяти, чем у IIS - по-видимому) он разбил отладчик с условием переполнения стека.
  4. Изменение моего динамического c var на сопоставление классов JSON, похоже, решило проблему.

Я не уверен на вопрос «почему» это имело место, поскольку даже с одним элементом в объекте JSON динамическое c вызовет переполнение стека. Как только я отошел от Dynami c, он работал нормально - и работал нормально последние 3 недели.

Надеюсь, эта информация кому-то поможет.

...