c# - NullReferenceException 而涉及的对象是有效的

标签 c# multithreading datatable nullreferenceexception

NullReferenceException 在所有涉及的对象都有效的行上被抛出。 StackTrace 显示第 # 行是 432。

代码是

enter image description here

这里,FlagstempFlags 都是数据表。两个数据表的列的数据类型都是原始的(十进制、日期时间、短)。该应用程序是一个多线程应用程序,代码片段属于线程函数。 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/

相关文章:

mysql - VB.NET WPF 如何从datagrid获取列值?

C#从linq组中的日期获取分钟数

c# - 将格式应用于 DataTable 中的列

c# - 反射生成的类型和泛型

c - OpenMP for 循环没有给出正确的结果

javascript - 表格特定列的范围搜索过滤器

c# - mysql + .NET 连接器 : "Column ' CharacterID' cannot be null"

c# - 如何在 .NET 中编写写时复制列表

Java Multithreaded App - 如何动态取消 Futures 对象

javascript - 使用下拉菜单显示特定的数据表