NullReferenceException
在所有涉及的对象都有效的行上被抛出。 StackTrace
显示第 # 行是 432。
代码是
这里,Flags
和tempFlags
都是数据表。两个数据表的列的数据类型都是原始的(十进制、日期时间、短)。该应用程序是一个多线程应用程序,代码片段属于线程函数。 Flags
在实例级别被标记,即共享给所有线程,而 tempFlags
在线程函数内声明。
在这个特定的时间实例中,Flags
包含 1946 条记录,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
看起来 Merge 语句不是线程安全的,因为在将第 432 行放入锁后,异常消失了,到目前为止。
最佳答案
每当您从框架内获得 NullReferenceException
并且您是多线程时,这几乎肯定是一个线程安全问题,您没有在应该的地方应用锁。
关于c# - NullReferenceException 而涉及的对象是有效的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14117078/