2013-01-02 12 views
6

NullReferenceException को उस लाइन पर फेंक दिया जा रहा है जिस पर सभी शामिल ऑब्जेक्ट मान्य हैं। StackTrace से पता चलता लाइन # 432NullReferenceException जबकि ऑब्जेक्ट्स वैध हैं

है कोड

enter image description here

यहाँ, Flags और tempFlags दोनों datatables हो रहा है। दोनों डेटाटेबल्स के कॉलम डेटा प्रकार आदिम (दशमलव, डेटाटाइम, लघु) हैं। एप्लिकेशन एक बहुप्रचारित अनुप्रयोग है और कोड स्निपेट थ्रेड फ़ंक्शन से संबंधित है। Flags उदाहरण स्तर पर decalred है i.e. सभी धागे को साझा किया गया है जबकि tempFlags थ्रेड फ़ंक्शन के अंदर घोषित किया गया है।

इस विशेष उदाहरण पर Flags में 1 9 46 के रिकॉर्ड और tempFlags शामिल हैं 1. तो, यह NullReferenceException क्यों है ??

# संपादित करें 1

ex.InnerException 
null 
ex.StackTrace 
at System.Data.DataTable.RecordStateChanged(Int32 record1, DataViewRowState oldState1, DataViewRowState newState1, Int32 record2, DataViewRowState oldState2, DataViewRowState newState2) 
at System.Data.DataTable.InsertRow(DataRow row, Int64 proposedID) 
at System.Data.DataTable.MergeRow(DataRow row, DataRow targetRow, Boolean preserveChanges, Index idxSearch) 
at System.Data.Merger.MergeTable(DataTable src, DataTable dst) 
at System.Data.Merger.MergeTableData(DataTable src) 
at System.Data.Merger.MergeTable(DataTable src) 
at System.Data.DataTable.Merge(DataTable table, Boolean preserveChanges, MissingSchemaAction missingSchemaAction) 
at System.Data.DataTable.Merge(DataTable table) 
at [...].cs:line 432" 
ex.Data 
    {System.Collections.ListDictionaryInternal} 
     [System.Collections.ListDictionaryInternal]: {System.Collections.ListDictionaryInternal} 
     IsFixedSize: false 
     IsReadOnly: false 
     Keys: {System.Collections.ListDictionaryInternal.NodeKeyValueCollection} 
     Values: {System.Collections.ListDictionaryInternal.NodeKeyValueCollection} 
ex.Message 
"Object reference not set to an instance of an object." 
ex.Source 
"System.Data" 

# संपादित 2

यह मर्ज बयान सुरक्षित थ्रेड नहीं है के रूप में एक ताला अंदर लाइन 432 डालने के बाद, अपवाद चला गया है, अब तक लग रहा है ।

+0

आप प्रयोग करते हैं? जैसा कि आप tempFlags को साफ़ कर रहे हैं। – Adil

+1

क्या आप अपना अपवाद विवरण पोस्ट कर सकते हैं? आंतरिक अपवाद, स्टैक ट्रेस, आदि – ryadavilli

+0

@ एडील कोई फर्क नहीं पड़ता, है ना? उस लाइन से पहले अपवाद फेंक दिया गया है, और 'tempFlags' विधि में एक स्थानीय चर है। –

उत्तर

1

कोड के इस टुकड़े के लिए विशिष्ट इस अपवाद (आईएमओ) का स्पष्टीकरण।

हम कहते हैं कि धागा एक मर्ज निष्पादित हो रहा है की सुविधा देता है और datatable Dt1 जो referenceToDatatable के रूप में मर्ज में संग्रहीत है, इस बीच

थ्रेड बी में आता है और गुजरता Dt2Merge जो (referenceToDatatable रूप Merge में संग्रहित है के संदर्भ में है गुजरता वही क्योंकि गैर-आदिम वस्तुएं पुनर्नवीनीकरण से गुजरती हैं, मर्ज थ्रेड सुरक्षित नहीं है और कोई लॉक नहीं है) और इसलिए Dt1Dt2 द्वारा ओवरराइट किया गया है।

अब तक कोई अपवाद नहीं है क्योंकि Dt2 समान संरचना का है और यह null नहीं है।

अब थ्रेड बी निलंबित कर दिया गया है और थ्रेड ए आता है, Merge को पूरा करता है और बाहर निकलता है, इसलिए Dt1 को हटा देता है जो referenceToDatatable को भी हटा देता है।

अब थ्रेड बी में आता है और referenceToDatatable = null पाता है - tempFlags के लिए>ताला अपवाद

2

चूंकि ऐसा लगता है कि एक नई पंक्ति डालने पर यह हो रहा है, System.Data.DataTable.InsertRow(DataRow row, Int64 proposedID) मुझे लगता है कि एक बाधा है कि एक क्षेत्र शून्य नहीं हो सकता है। और आप स्रोत तालिका से एक नल डालने की कोशिश कर रहे हैं।

या, एक गणना कॉलम है और इनपुट कॉलम में से एक शून्य है।

+0

यह [उत्तर] (http://stackoverflow.com/a/490569/649524) सुझाता है इस समस्या के लिए निवारक उपायों। – Tilak

2

जब भी आपको फ्रेमवर्क के भीतर से NullReferenceException मिलते हैं और आप बहुप्रतिष्ठित होते हैं, तो यह लगभग निश्चित रूप से एक थ्रेड-सुरक्षा समस्या है जहां आप ताले लगाने वाले नहीं हैं जहां आपको होना चाहिए।

+0

यह मुझे धीमा कर रहा है क्योंकि ढांचे का लंबा जीवन समारोह थ्रेड सुरक्षित नहीं है !!! – bjan

+1

@bjan जब तक ऑब्जेक्ट्स प्रलेखन में थ्रेड-सुरक्षित होने का दावा नहीं करते हैं, तब तक वे सुरक्षित ताले/बाधाओं/सावधानियों के बिना सुरक्षित रूप से उपयोग नहीं किए जा सकते हैं। * यह 99 +% कोड से अलग नहीं है जिसे मैं (या आप) लिखता हूं जो थ्रेड-सुरक्षित नहीं है क्योंकि यह सावधानी से डिजाइन नहीं किया गया था। * कोड को दोष न दें जो इसकी संविदात्मक सीमाओं के बाहर उपयोग किया जाता है। (मैं केवल एक थ्रेड को किसी भी समय एक साधारण लॉक के माध्यम से डीटी तक पहुंचने की इजाजत देता हूं - या बेहतर, किसी भी समय किसी एक थ्रेड को "डीटी" किसी भी समय दें - और देखें कि क्या समस्याएं "ठीक" होती हैं। कार्य >> "सबसे तेज"।) –

संबंधित मुद्दे