Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 应用程序重新启动时未释放Autofac SingleInstance?_C#_Asp.net Mvc 4_Autofac_Lucene.net - Fatal编程技术网

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

C# 应用程序重新启动时未释放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

在我的MVC4项目中,在我创建的对象中有一个lucene
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'位位于独立解决方案的从属程序集中,但我不认为mattersIs
OnApplicationEnd
正在被调用?