(यह कुछ घंटे पहले पूछे गए एक प्रश्न का पुनर्लेखन है जिसमें पर्याप्त विवरण नहीं था और बंद कर दिया गया था)

मेरे पास एक आयात दिनचर्या है जो एक जेसन फ़ाइल से सामग्री लेती है और सामग्री को "आइटम" नामक गतिशील चर में सामग्री को पढ़ने के लिए JsonConvert.Deserialize() का उपयोग करती है। यहां कोड का एक टुकड़ा है (संक्षिप्तता के लिए कुछ सामान हटा दिया गया है - यह दिनचर्या 800 लाइन लंबी है ....)

इसे पेज_लोड ईवेंट से इस तरह ट्रिगर किया जाता है;


        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
            }
        }

मैं इस प्रक्रिया के दौरान स्ट्रिंगबिल्डर ऑब्जेक्ट में जोड़ रहा हूं, फिर स्ट्रिंग बिल्डर की सामग्री को जेसन में आइटम्स के माध्यम से लूपिंग के अंत में लॉग फ़ाइल में लिख रहा हूं।

अब विधि ही;

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>

दिनचर्या के अंत में मैं लॉग जानकारी को टेक्स्ट फ़ाइल में आउटपुट करता हूं। लॉग फ़ाइल दिखाती है कि एक लूप चल रहा है लेकिन पूरा होने से पहले दूसरा शुरू हो जाता है, इसलिए लॉग फ़ाइल एक लूप से दूसरे के साथ मिश्रित जानकारी दिखाती है। लॉग प्रति आयात पर 3 रिकॉर्ड लिखे जाने चाहिए (केवल 3 रिकॉर्ड के साथ परीक्षण)। लेकिन क्या हो रहा है कि दिनचर्या एक आयात शुरू करती है लेकिन फिर इसके साथ एक द्वितीयक आयात होता है - नीचे देखें (मेरे नोट्स वर्ग ब्रेसिज़ से घिरे सीएपीएस में हैं)। लाइन के आउट ऑफ ऑर्डर लेखन पर ध्यान दें (समय टिकट देखें)।

[**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() विधि चला रही हैं। क्या यहां पेज_लोड के साथ कोई समस्या हो सकती है? विधि को कॉल करने वाली यह एकमात्र प्रक्रिया है।

क्लिफ

1
Cliff 6 अगस्त 2020, 05:01

1 उत्तर

सबसे बढ़िया उत्तर

बस अगर कोई इसे भविष्य में देखता है। यहाँ मेरी समस्या वास्तव में क्या थी।

  1. मैं विजुअल स्टूडियो के इनबिल्ट वेब सर्वर (कैसिनी) का उपयोग कर रहा था
  2. मैं प्राप्त होने वाले JSON डेटा को पढ़ने के लिए 'गतिशील' चर का उपयोग कर रहा था और फिर उस गतिशील के माध्यम से लूपिंग कर रहा था
  3. मैंने कैसिनी के बजाय आईआईएस का उपयोग करने के लिए डीबगर को बदल दिया। इसने इस मुद्दे को क्षण भर में ठीक कर दिया (मैं समझता हूं कि कैसिनी के पास आईआईएस की तुलना में कम मेमोरी आवंटन स्थान है - जाहिरा तौर पर)
  4. ऐसा लगता है कि गतिशील चर प्रकार के उपयोग से स्मृति के कुछ रूप ओवर-रन हो जाते हैं और इसने डिबगर को स्टैकओवरफ्लो स्थिति के साथ क्रैश कर दिया।
  5. मेरे डायनेमिक संस्करण को क्लास-मैप की गई JSON व्यवस्था में बदलने से समस्या ठीक हो गई।

मुझे यकीन नहीं है कि 'क्यों' ऐसा ही था क्योंकि JSON ऑब्जेक्ट में सिर्फ एक आइटम के साथ भी, डायनामिक स्टैकओवरफ़्लो का कारण होगा। एक बार जब मैं गतिशील से दूर चला गया, तो यह ठीक चला - और पिछले 3 सप्ताह से ठीक चल रहा है।

आशा है कि यह जानकारी किसी की मदद करेगी।

0
Cliff 4 सितंबर 2020, 04:15