【问题标题】:ArcGIS add-in: creating shapefile in backgroundworker, can't display the result in the same ArcMap sessionArcGIS 插件:在后台工作程序中创建 shapefile,无法在同一 ArcMap 会话中显示结果
【发布时间】:2012-10-02 22:51:01
【问题描述】:

插件最初是在没有使用后台工作人员的情况下编写的,并且运行良好。我能够创建一个 shapefile,它可以在同一个 ArcMap 会话中执行后立即添加和查看。

然后我尝试在 UI 中添加一个进度条,在执行完成之前它没有显示任何更改。那时我添加了一个 backgroundworker 类并将耗时的 shapefile 创建代码(没有任何更改)移动到 backgroundworker 的 dowork 事件处理程序中。

虽然这使 UI 响应速度更快,但如果我将结果 shapefile 添加到同一个 ArcMap 会话中,屏幕上不会显示任何内容。 ArcMap 还报告了一个绘图错误,说“无法获取锁[表 xxx 正在被另一个进程写入]。

我确信此时写作已经完成。如果我关闭当前 ArcMap 会话并启动一个新会话,我可以毫无问题地查看结果。

要发布的代码太多,我强烈感觉问题是由于将代码原样移动到 backgroundworker 类引起的。我希望你们在后台工作人员/ArcGIS 插件方面更有经验的人可以给我一些指示,这可能是罪魁祸首。提前致谢!

【问题讨论】:

    标签: c# backgroundworker add-in arcgis esri


    【解决方案1】:

    我解决了这个问题,但不太清楚为什么会这样。

    backgroundworkder_DoWork() 调用一个使用 FeatureCursor 的函数,方法如下:

    IFeatureCursor featureCursor = FeatureClass.Update(null,true);

    使用光标浏览功能更新

    如果(某些条件) { featureCursor=FeatureClass.Update(null,true); 再次通过功能进行一些额外的更新 }

    我发现即使最后在 featureCursor 上运行 Marshal.ReleaseComObject() 方法,对 shapefile 的写锁定(“.wr.lock”)仍然存在。但是,如果我在“if”子句中定义并使用新游标而不是重新使用 featureCursor,则 Marshal.ReleaseCombObject() 方法可以删除写锁定。但是话又说回来,如果定义并使用了新的游标,我就不需要使用 release 方法。虽然“.wr.lock”文件在执行后仍然存在,但我可以将输出 shapefile 添加到同一个 ArcMap 会话中并毫无问题地查看它。

    如果有人能解释为什么上面的代码放在 UI 线程中时没有引起任何问题,但是当被 backgroundworker_DoWork() 调用时会遇到锁定问题,我们将不胜感激。

    而且像我在上面的代码中那样重复使用 FeatureCcursor 是不是一个坏习惯?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-21
      • 1970-01-01
      • 2016-02-08
      • 2013-01-09
      • 1970-01-01
      • 2016-04-07
      • 2012-03-06
      • 1970-01-01
      相关资源
      最近更新 更多