C# 应用程序重新启动时未释放Autofac SingleInstance?
在我的MVC4项目中,在我创建的对象中有一个luceneC# 应用程序重新启动时未释放Autofac SingleInstance?,c#,asp.net-mvc-4,autofac,lucene.net,C#,Asp.net Mvc 4,Autofac,Lucene.net,在我的MVC4项目中,在我创建的对象中有一个luceneIndexWriter,它是一个IDisposable对象,名为LuceneIndex 当我的对象被释放时,它调用indexwriter的Dispose()方法。 处置IndexWriter会删除磁盘上名为write.lock的文件。 我的LuceneIndex是这样注册的: builder.RegisterType<LuceneIndex>() .WithParameter("indexLocation", HttpCont
IndexWriter
,它是一个IDisposable对象,名为LuceneIndex
当我的对象被释放时,它调用indexwriter的Dispose()方法。 处置IndexWriter会删除磁盘上名为
write.lock
的文件。
我的LuceneIndex是这样注册的:
builder.RegisterType<LuceneIndex>()
.WithParameter("indexLocation", HttpContext.Current.Server.MapPath(UmbracoConfig.IndexPath))
.SingleInstance();
builder.RegisterType()
.WithParameter(“indexLocation”,HttpContext.Current.Server.MapPath(UmbracoConfig.IndexPath))
.SingleInstance();
当我停止/回收/重新启动网站时,write.lock不会被删除,因此从现在起,我从lucene得到一个例外,如下所示:
消息:[锁定获取失败异常:锁定获取超时:NativeFSLock@C:\Dev\FOO\http\App\u Data\Index\write.lock:
System.IO.IOException:进程无法访问该文件
“C:\Dev\FOO\http\App\u 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\u lock\u timeout
增加到1分钟,以处理这些场景。st可以在容器上显式调用,如下所示:
protected override void OnApplicationEnd(object sender, EventArgs e)
{
_container.Dispose();
base.OnApplicationEnd(sender, e);
}
另一方面:应用程序结束和应用程序开始重叠,这样当新进程启动时,结束进程仍然有
write.lock
文件句柄。为了解决这个问题,我简单地将lucene锁获取超时write\u lock\u timeout
增加到1分钟,以处理这些场景。发生了什么当出现电源故障时,是否可以显示应用程序中的代码,在应用程序重新启动之前明确处理容器?@Steven,我不确定……正在进行一些额外的测试……似乎不是文件的存在,而是锁定写访问权限的进程所持有的文件句柄……现在我对以下问题感到困惑:为什么重新启动应用程序池不会释放这些文件句柄,而不管如何处置。@TravisIllig我没有显式处置容器,但我现在已经添加了它。调试显示正在调用它,但我的SingleInstance没有调用它的dispose。容器设置和我添加的“OnApplicationEnd”位位于我是一个单独的解决方案,但我不认为mattersIs在应用程序上被调用?当出现电源故障时会发生什么?你能在应用程序中显示代码,在应用程序重新启动之前明确处理容器吗?@Steven,我不确定……做一些额外的测试……似乎不是存在现在我很困惑,为什么重新启动应用程序池不会释放这些文件句柄,而不管如何处置。@TravisIllig我没有显式处置容器,但我现在已经添加了它。调试显示它正在被调用,但我的SingleInstance没有调用dispose。容器设置和我添加的'OnApplicationEnd'位位于独立解决方案的从属程序集中,但我不认为mattersIsOnApplicationEnd
正在被调用?