应用程序重新启动时未释放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的最佳方法是什么?

我应该做一些完全不同的事情吗?

应用程序重新启动时未释放Autofac SingleInstance

Dispose必须在容器上显式调用,如下所示:

protected override void OnApplicationEnd(object sender, EventArgs e)
{
    _container.Dispose();
    base.OnApplicationEnd(sender, e);
}

附带说明:应用程序结束和应用程序开始重叠,因此当新进程开始时,结束进程仍然具有write.lock文件句柄。为了解决这个问题,我只需将lucene锁获取超时WRITE_LOCK_TIMEOUT增加到1分钟即可处理这些场景。