线程投掷对象未找到,但对象显然在那里

时间:2012-08-01 11:03:12

标签: c# parallel-processing nullreferenceexception

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

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

我有点难过为什么会抛出异常。

2 个答案:

答案 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修改列值时   在行上或通过单独指定列值对象   实例化的列值对象。

祝你好运!