我正在开发一个ArcGIS自定义工具,它将与ArcView集成。该工具使用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运行时中的内置保护可能会阻止我分配超过一定数量的内存?
谢谢!
答案 0 :(得分:0)
这可能是数据转换问题。举例来说:
record.max_speed = dataReader.GetInt32(12);
你可以做的是注释掉所有分配值的行,看它是否运行,然后一次添加一行,看看哪一行导致错误。
修改
根据评论看起来问题是由于使用了LinkedList。为什么不使用List?
答案 1 :(得分:0)
ArcMap悄悄地吞下用户添加组件的异常。由您来捕获和处理代码中出现的任何异常。
一种简单的故障排除技术包括将整个代码块包装成如下所示:
try {
...
} catch (Exception ex) {
MessageBox.Show(ex.ToString());
throw;
}
希望你能得到一条信息丰富的信息。
答案 2 :(得分:0)
我们有很长时间以来与Arc GIS有类似的神秘崩溃问题。我们最终发现,对于Arc GIS帐户,在服务器端启用了磁盘配额。删除配额解决了这个问题。
如果其他任何事情无效,你可以尝试一下。
答案 3 :(得分:0)
我找到的解决方案是在不同的线程中进行所有处理。我的工具结构的方式,按钮事件是向“作业处理程序”发送一个命令(让我们称之为,我不会分享我不那么原始的内部类名),它正在执行它(因为没有其他工作已安排)。我认为,由于内存分配花费的时间太长,ArcGIS认为COM DLL没有响应,只是在没有任何指示的情况下崩溃处理这种情况。
感谢大家一直提供有用的答案。