NullReferenceException
関連するすべてのオブジェクトが有効な行にスローされています。StackTrace
行番号が 432 であることを示しています。
コードは
ここではFlags
、tempFlags
両方ともデータテーブルです。両方のデータテーブルの列のデータ型はプリミティブ (decimal、datetime、short) です。アプリケーションはマルチスレッド アプリケーションであり、コード スニペットはスレッド関数に属します。Flags
インスタンスレベルで宣言されます。つまりtempFlags
、スレッド関数内で宣言されている間、すべてのスレッドで共有されます。
ここで、この特定のインスタンスでは、Flags
1946 レコードtempFlags
が含まれ、1 が含まれています。
編集#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行目をロック内に配置した後、例外がなくなったため、Mergeステートメントはスレッドセーフではないようです。