应用程序重新启动时未释放Autofac SingleInstance
本文关键字:Autofac SingleInstance 释放 重新启动 应用程序 | 更新日期: 2023-09-27 18:21:14
在我的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:锁定获取超时: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
的最佳方法是什么?
我应该做一些完全不同的事情吗?
Dispose必须在容器上显式调用,如下所示:
protected override void OnApplicationEnd(object sender, EventArgs e)
{
_container.Dispose();
base.OnApplicationEnd(sender, e);
}
附带说明:应用程序结束和应用程序开始重叠,因此当新进程开始时,结束进程仍然具有write.lock
文件句柄。为了解决这个问题,我只需将lucene锁获取超时WRITE_LOCK_TIMEOUT
增加到1分钟即可处理这些场景。