C# C语言中ArcGIS内存分配崩溃

C# C语言中ArcGIS内存分配崩溃,c#,.net,memory-management,arcgis,C#,.net,Memory Management,Arcgis,我正在为ArcGIS开发一个自定义工具,该工具将与ArcView集成。该工具使用C语言开发,基本上连接到SQL数据库,将数据提取到本地数据结构,执行大量统计分析,然后将结果显示为新层 崩溃发生在代码执行期间 LinkedList<SegmentDbRecord> segmentData = new LinkedList<SegmentDbRecord>(); while( dataReader.Read() ) { SegmentDbRecord record = n

我正在为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运行时中的内置保护会阻止我分配超过一定数量的内存吗


谢谢大家!

这可能是一个数据转换问题。以该行为例:

record.max_speed = dataReader.GetInt32(12);
max_speed是int32吗? 位置12的字段是否为可转换为int32的值? 您可以做的是注释掉所有分配值的行,看看它是否运行,然后一次添加一行,看看是哪一行导致了错误

编辑


根据评论,问题似乎是由于使用了LinkedList。为什么不直接使用列表呢?

ArcMap悄悄地接受来自用户添加组件的异常。由您来捕获和处理代码中出现的任何异常

一种简单的故障排除技术包括将整个代码块包装成如下内容:

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

希望您能收到一条信息。

很久以前,Arc GIS也出现过类似的神秘崩溃问题。我们最终发现在服务器端为Arc GIS帐户启用了磁盘配额。取消配额解决了这个问题


如果其他任何事情都不起作用,您可能可以尝试一下。

我找到的解决方案是在不同的线程中执行所有处理。按照我的工具的结构,button事件向作业处理程序发送了一个命令,我们称之为,我不会共享我的不是很原始的内部类名,因为没有安排其他工作,所以我不会立即执行它。我认为,由于内存分配时间太长,ArcGIS认为COM DLL没有响应,只是在没有任何指示的情况下崩溃了


感谢大家总是提供有用的答案。

我在这段代码中没有任何与ArcGIS相关的内容。你怎么这么肯定这是ArcGIS的问题?您收到的确切错误消息是什么?如果您可以向我们显示引发异常的ToString,这将有所帮助。我从ArcGIS收到一个崩溃消息,消息如下:ArcGIS Desktop遇到严重的应用程序错误,无法继续。我没有收到任何特定消息。。。仅邀请发送错误报告。我确实得到了一个转储文件,但它似乎不可用。ArcGIS使用的是非.NET组件吗?如果我理解Decapsuleur的问题,他正在创建一个用C++/COM编写的ArcMap插件。同样地,ArcMap的外接程序是COM DLL,因此如果我关注这个问题,我们将再次讨论这个COM项目。在没有分配代码的情况下,问题仍然会出现。只要分配内存并在列表中添加记录就足以使程序崩溃。我在分配了17969条记录后得到崩溃。这大约是1 MB的数据。请检查事件日志以查看应用程序池是否正在回收。如何检查?另外,我使用列表也会遇到同样的问题。我之所以使用LinkedList,是因为我想避免调整数组的大小,因为这样做成本较高。请转到“管理工具”->“事件日志”,查看在运行代码的同时是否写入了任何错误。您是否有显示抛出异常的文本?我不确定我是否理解您所指的服务器。我相信Amazedsain所指的是ArcGIS服务器,而不是ArcMap。