0

我在 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); });

所有对象都在方法中声明和处理,因此每个线程都有自己的实例。

我对为什么这会引发异常感到有些困惑。

4

2 回答 2

0

我对这种专栏没有太多经验,但也许这会有所帮助:

由于 SqlGeometry 不是 .NET 中的基本类型之一,因此请确保遵守Microsoft的以下引用:

尽管可以将列定义为基本 .NET Framework 数据类型和 Byte[] 以外的数据类型,但此类列将被视为用户定义的类型,受以下使用限制。(有关用户定义类型的更多信息,请参阅创建和使用用户定义类型。)

该列不能是 RowFilter 或 Select 表达式的一部分。

如果该列用作 PrimaryKey,或用作 Sort 或用于 DataView,则必须将其视为不可变字段;列数据一旦添加到表中就不得更改。

它的 ColumnMapping 只能设置为 MappingType.Element。

实现列数据类型的类必须用 SerializableAttribute 进行标记,如果需要,实现 ISerializable 或 IXmlSerializable 接口。

对更改跟踪的支持是有限的。要利用 DataTable 类的更改跟踪机制,实现列数据类型的类必须实现 IChangeTracking 接口,或者通过在行上调用 SetModified 或通过将列值对象分配给单独实例化的列值对象。

祝你好运!

于 2012-08-02T11:12:28.963 回答
0

注释掉该行时代码是否运行良好?我有一种感觉,问题要么不在那条线上,要么是 SqlGeometry 把事情搞砸了。

于 2012-08-02T09:56:55.000 回答