0

C# VS11 ベータ版のアプリケーションがあります。

以下のコードはスローします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の基本タイプの1つではないため、Microsoftからのこの引用に準拠していることを確認してください。

列をベースの.NETFrameworkデータ型およびByte[]以外のデータ型として定義することは可能ですが、そのような列は、次の使用制限に従って、ユーザー定義型として扱われます。(ユーザー定義型の詳細については、ユーザー定義型の作成と使用を参照してください。)

列をRowFilterまたはSelect式の一部にすることはできません。

列をPrimaryKey、Sort、またはDataViewとして使用する場合は、不変フィールドとして扱う必要があります。テーブルに追加された列データは変更しないでください。

そのColumnMappingは、MappingType.Elementにのみ設定できます。

列のデータ型を実装するクラスは、SerializableAttributeでマークする必要があり、必要に応じてISerializableまたはIXmlSerializableインターフェイスを実装します。

変更追跡のサポートは制限されています。DataTableクラスの変更追跡メカニズムを利用するには、列のデータ型を実装するクラスがIChangeTrackingインターフェイスを実装するか、行でSetModifiedを呼び出すか、列の値が変更されたときにDataRowに通知する責任を引き継ぐ必要があります。列値オブジェクトを個別にインスタンス化された列値オブジェクトに割り当てます。

幸運を!

于 2012-08-02T11:12:28.963 に答える
0

行がコメントアウトされている場合、コードは正常に実行されますか?問題がその行にないか、またはSqlGeometryが問題を引き起こしていると感じています。

于 2012-08-02T09:56:55.000 に答える