在我的MVC4项目中,我在我创建的对象中有一个lucene IndexWriter
,这是一个名为LuceneIndex
的IDisposable对象。
处理我的对象时,它调用indexwriter的Dispose()方法。
处理IndexWriter会删除名为write.lock
的磁盘上的文件。
我的LuceneIndex注册如下:
builder.RegisterType<LuceneIndex>()
.WithParameter("indexLocation", HttpContext.Current.Server.MapPath(UmbracoConfig.IndexPath))
.SingleInstance();
当我停止/回收/重新启动网站时,不会删除write.lock,因此从现在开始我从lucene得到一个例外:
消息:[LockObtainFailedException:Lock获取超时:NativeFSLock @ C:\ Dev \ FOO \ http \ App_Data \ Index \ write.lock: System.IO.IOException:进程无法访问该文件 'C:\ Dev \ FOO \ http \ App_Data \ Index \ write.lock'因为正在使用它 通过另一个过程。 ...
注意:未触发dispose方法中的断点。应该是吗?
确保正确处理IndexWriter的最佳方法是什么,以免留下write.lock
?
我应该做一些完全不同的事情吗?
答案 0 :(得分:0)
必须在容器上显式调用Dispose,如下所示:
protected override void OnApplicationEnd(object sender, EventArgs e)
{
_container.Dispose();
base.OnApplicationEnd(sender, e);
}
旁注:应用程序结束和应用程序开始重叠,以便在新进程启动时结束进程仍然具有write.lock
文件句柄。为了解决这个问题,我只是将lucene锁定获取超时WRITE_LOCK_TIMEOUT
增加到1分钟来处理这些情况。