0

ArcView と統合する ArcGIS 用のカスタム ツールに取り組んでいます。このツールは C# を使用して開発されており、基本的に SQL データベースに接続し、データをローカル データ構造にフェッチし、大量の統計分析を実行してから、結果を新しいレイヤーとして表示します。

このコードの実行中にクラッシュが発生します。

LinkedList<SegmentDbRecord> segmentData = new LinkedList<SegmentDbRecord>();
while( dataReader.Read() )
{
  SegmentDbRecord record = new SegmentDbRecord();

  record.first_stop_id = dataReader.GetInt32(0);
  record.first_stopway = dataReader.GetString(1);
  record.first_stopway_X = dataReader.GetString(2);

  record.second_stop_id = dataReader.GetInt32(3);
  record.second_stopway = dataReader.GetString(4);
  record.second_stopway_X = dataReader.GetString(5);

  record.segment_start = Tools.timeToFloat((DateTime)dataReader.GetValue(6));
  record.segment_finish = Tools.timeToFloat((DateTime)dataReader.GetValue(7));

  record.stop1_long = dataReader.GetFloat(8);
  record.stop1_lat = dataReader.GetFloat(9);
  record.stop2_long = dataReader.GetFloat(10);
  record.stop2_lat = dataReader.GetFloat(11);

  record.max_speed = dataReader.GetInt32(12);
  record.avg_speed = dataReader.GetInt32(13);
  record.route_hnd = dataReader.GetInt32(14);
  record.seq_1 = dataReader.GetInt32(15);
  record.seq_2 = dataReader.GetInt32(16);
  record.route_name = dataReader.GetString(17);

  segmentData.AddFirst(record);

}

この段階では、クエリの結果をリンク リストに保存しているだけです。メモリの割り当て中にクラッシュが発生したと確信していますが、まだ十分なメモリが残っており、クエリがそれほど大きなデータセットを返していないことはわかっています。新しい「レコード」を割り当てる単純なループを実行すると、非常に速くクラッシュします。ArcGIS ランタイムに組み込まれている保護機能によって、一定量以上のメモリを割り当てることができないことを知っている人はいますか?

ありがとうございました !

4

4 に答える 4

0

データ変換の問題である可能性があります。たとえば、次の行を見てください。

record.max_speed = dataReader.GetInt32(12);
  • max_speed は int32 ですか?
  • 12 桁目のフィールドは int32 に変換できる値ですか?

できることは、値を割り当てるすべての行をコメントアウトし、それが実行されるかどうかを確認してから、一度に1行ずつ追加して、エラーの原因となっている行を確認することです。

編集

コメントに基づいて、問題は LinkedList の使用が原因であるように見えます。リストを使用しないのはなぜですか?

于 2009-08-06T16:13:02.730 に答える
0

ArcMap は、ユーザーが追加したコンポーネントからの例外を静かに飲み込みます。コードで発生する例外をトラップして処理するのは、ユーザー次第です。

簡単なトラブルシューティング手法は、コード ブロック全体を次のようにラップすることで構成されます。

try {
    ... 
} catch (Exception ex) { 
    MessageBox.Show(ex.ToString());
    throw;
}

有益なメッセージが届くことを願っています。

于 2009-08-06T16:15:45.470 に答える
0

かなり前に、ArcGIS で同様の不可解なクラッシュの問題が発生しました。最終的に、ArcGIS アカウントのサーバー側でディスク クォータが有効になっていることがわかりました。クォータを削除すると、問題が解決しました。

他に何も機能していない場合は、おそらくそれを試すことができます。

于 2009-08-06T16:19:17.413 に答える
0

私が見つけた解決策は、すべての処理を別のスレッドで行うことです。私のツールが構造化されている方法では、ボタンイベントはコマンドを「ジョブハンドラー」に送信していました(そう呼びましょう。それほどオリジナルではない内部クラス名は共有しません)。他の作業が予定されていた)。メモリの割り当てに時間がかかりすぎたため、ArcGIS は COM DLL が応答していないと見なし、何の兆候もなく単にクラッシュすることで状況を処理していたと思います。

皆様、いつも参考になる回答ありがとうございます。

于 2009-08-11T16:01:57.357 に答える