Arcengine 锁的问题,sr.lock和rd.lock的解决

前几天做一个项目的时候,遇见这样的需求,例如:有一批数据(shp),首先判断里面的一个字段,这个字段i

if(i>1)

{

就对这批数据入库

}

else 

{

就将这批数据拷到外面的单独的文件夹之中。

},这种需求。在程序中出现小于1的情况时,我想要复制这个文件,但是却出现了这个问题,“当前的文件被另一进程使用”,简单上网了一下,说是出现了lock的问题,下面还挺多的解决方案,如图:

Arcengine 锁的问题,sr.lock和rd.lock的解决_第1张图片

解决方法,我就引用其中的一个吧(纯复制见谅),

  IWorkspaceFactory2 ipWsFactory = new FileGDBWorkspaceFactoryClass();

         //关闭资源锁定

IWorkspaceFactoryLockControl ipWsFactoryLock;

ipWsFactoryLock = (IWorkspaceFactoryLockControl)ipWsFactory;

if (ipWsFactoryLock.SchemaLockingEnabled)

{

ipWsFactoryLock.DisableSchemaLocking();

}

我想这也太简单了,就复制到我的程序下面了,以为就这样解决了,但是没想到还是出现了“文件被另一进程占用的情况”,我想难道我复制的不对,就找了一下,还是这个代码啊,没问题啊。想了半天,代码没问题。最后没办法只能靠自己了。这时候我知道此时不能复制是由于产生了sr.lock的文件,但是当我调试的时候却发现不光有sr.lock,还有一个rd.lock,这是怎么回事?继续调试发现,上面这个代码是没错的,但是上面的代码只能消除sr.lock,没法消除rd.lock,继续,那么rd.lock是怎么产生的呢?如图:


当openFeatureClass的时候产生了sr.lock,Search的时候产生了rd.lock,原来这样,只要释放这个cCursor就可以了吧,我在下面又添加了这句话,

  System.Runtime.InteropServices.Marshal.ReleaseComObject(cCursor);我想着这就可以了吧,再次运行,我日,这个问题又出现了“该文件由另一进程使用”,靠,不好使啊,我当时就是这个想法。于是又是上网搜索,但是还是那样。其实在我解决这个问题的时候也吸取到一部分经验,不是解决方法不对,可能是你想的方式不对,这么说吧,上面的代码都是正确的,但是为什么不好使呢。之后我就逐条语句查看,我发现

IFeatureCursor pCursor=pFeatureClass.Search(null,false);的时候确实是产生了rd.lock,但是这时我用完这个pCursor,我没及时的释放,然后我的程序是继续执行的,下面还有一个程序要执行pFeatureClss.Search(null,false),这时候还是会产生一个rd.lock,最后我使用  System.Runtime.InteropServices.Marshal.ReleaseComObject(cCursor);这个语句释放,但是我发现在文件里面的rd.lock并没有消失,就是由于这两个Search的时候是产生了两个rd.lock,后一个会覆盖前一个,在文件里面只会出现一个,及时你执行了释放的代码,前一个还是会有的,这就导致了你从表面上看感觉这个释放的代码没用了,但是其实是有用了。可能咱们只是看到了表面的东西。

不知道各位同学明白我的意思没有,想要解决这个rd.lock,就是在你产生锁的时候,及时的释放不要等到下一个锁的产生。其实“产生锁的时候,及时的释放不要等到下一个锁的产生”,这句话 就是解决这个锁的精髓了。大家不懂的同学和朋友可以私信我哦。





你可能感兴趣的:(GIS开发,Engine开发,Arcengine,锁,rd.lock,sr.lock)