我在C#VS11 Beta中有一个应用程序。
以下代码抛出NullReferenceException
(注释行)
private void ParralelProcessor(Int32 threadNum)
{
HashSet<Feature> Features = new HashSet<Feature>();
HashSet<FeatureType> FeatureTypes = new HashSet<FeatureType>();
DataTable TopographicFeatures = new DataTable();
DataTable TopographicFeatureObjects = new DataTable();
DataTable CartographicText = new DataTable();
DataTable CartographicSymbol = new DataTable();
List<DataRow> FeaturesAsRows = new List<DataRow>();
List<DataRow> FeatureObjectsAsRows = new List<DataRow>();
List<DataRow> CartographicTextAsRows = new List<DataRow>();
List<DataRow> CartographicSymbolAsRows = new List<DataRow>();
Thread.Sleep(100);
TopographicFeatures.Columns.Add("fid", typeof(System.Int64));
TopographicFeatures.Columns.Add("FeatureId", typeof(System.Int16));
TopographicFeatureObjects.Columns.Add("fid", typeof(System.Int64));
//BELOW
TopographicFeatureObjects.Columns.Add("GeoCoordinates", typeof(SqlGeometry)); //THIS LINE
//ABOVE
TopographicFeatureObjects.Columns.Add("TypeId", typeof(System.Int16));
CartographicText.Columns.Add("fid", typeof(System.Int64));
CartographicText.Columns.Add("textString", typeof(System.String));
CartographicText.Columns.Add("anchorPosition", typeof(System.Int16));
CartographicText.Columns.Add("font", typeof(System.Int16));
CartographicText.Columns.Add("height", typeof(System.Decimal));
CartographicText.Columns.Add("orientation", typeof(System.Decimal));
CartographicSymbol.Columns.Add("fid", typeof(System.Int64));
CartographicSymbol.Columns.Add("orientation", typeof(System.Decimal));
调试信息显示该表不是null
,也不是列集合。
它在Parralel.For
循环中调用的方法中运行,如下所示
Parallel.For(1, ThreadsPerFile + 1, X => { ParralelProcessor(X); });
所有对象都在方法中声明和处理,因此每个线程都有自己的实例。
我有点难过为什么会抛出异常。
答案 0 :(得分:0)
当行被注释掉时,代码运行正常吗? 我有一种感觉,问题不在于该行,或者是SqlGeometry正在抛弃它。
答案 1 :(得分:0)
我对这种专栏没有多少经验,但也许这会有所帮助:
由于SqlGeometry不是.NET中的基类型之一,因此请确保遵守Microsoft中的此引用:
虽然可以将列定义为除。之外的数据类型 基础.NET Framework数据类型和Byte [],这样的列就是 作为用户定义的类型处理,具有以下用途 限制。 (有关用户定义类型的更多信息,请参阅 创建和使用用户定义的类型。)
该列不能是RowFilter或Select表达式的一部分。
如果该列用作PrimaryKey,或用作Sort或用于DataView, 它必须被视为不可变的领域;列数据不得为 一旦它被添加到表中就改变了。
它的ColumnMapping只能设置为MappingType.Element。
必须是实现列数据类型的类 用SerializableAttribute标记,并在必要时实现 ISerializable或IXmlSerializable接口。
对变更跟踪的支持有限。使用DataTable class的更改跟踪机制,实现的类 列的数据类型必须实现IChangeTracking 接口,或接管通知DataRow的责任 通过调用SetModified修改列值时 在行上或通过单独指定列值对象 实例化的列值对象。
祝你好运!