0

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

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

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

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

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

4

1 回答 1

0

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

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 是不是一个坏习惯?

于 2012-10-03T20:41:17.157 回答