应用重启时,Autofac SingleInstance不会被处理?

时间:2015-11-10 03:02:29

标签: c# asp.net-mvc-4 autofac lucene.net

在我的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

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

1 个答案:

答案 0 :(得分:0)

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

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

旁注:应用程序结束和应用程序开始重叠,以便在新进程启动时结束进程仍然具有write.lock文件句柄。为了解决这个问题,我只是将lucene锁定获取超时WRITE_LOCK_TIMEOUT增加到1分钟来处理这些情况。