调试时ASP.NET中的锁问题

调试时ASP.NET中的锁问题,asp.net,locking,Asp.net,Locking,我正在使用lucence.net创建一个文件作为“锁”。据我所知,它只是创建了一个要写入的文件,如果不能写入,数据库就会被锁定。我得到下面的例外 我叫lucence_init(),除非它只发生一次。设置当前工作文件夹和其他内容后,我在应用程序启动中调用它 我不知道这是什么时候发生的,但我知道只有当我在visual Studio中点击F5时才会发生。而且(很明显)它从来不会在第一次发生。我认为当我遇到异常,点击停止,修复并尝试运行代码时,就会发生这种情况。我需要使用系统托盘中的图标停止VS Web

我正在使用lucence.net创建一个文件作为“锁”。据我所知,它只是创建了一个要写入的文件,如果不能写入,数据库就会被锁定。我得到下面的例外

我叫lucence_init(),除非它只发生一次。设置当前工作文件夹和其他内容后,我在应用程序启动中调用它

我不知道这是什么时候发生的,但我知道只有当我在visual Studio中点击F5时才会发生。而且(很明显)它从来不会在第一次发生。我认为当我遇到异常,点击停止,修复并尝试运行代码时,就会发生这种情况。我需要使用系统托盘中的图标停止VS Web服务器并重新运行代码(偶尔手动删除锁定文件,但现在我让visual Studio将其作为后期构建事件来执行。这很奇怪,可能我不需要此部分)

无论如何,由于这个init问题,我的其他代码因为写异常而没有运行,我不能更改顺序,也不想围绕它编程,所以我如何解决这个问题,这样调试这个webapp就不那么烦人了

Lock obtain timed out: NativeFSLock@c:\dev\prj\...\App_Data\LuceneIndex_a\write.lock: System.IO.IOException: The process cannot access the file 'c:\dev\prj\...\App_Data\LuceneIndex_a\write.lock' because it is being used by another process.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
   at Lucene.Net.Store.NativeFSLock.Obtain()

当您的索引被打开以便写入时,Lucene.Net会创建一个锁文件。如果索引已打开但未正确关闭,则锁定文件将保留。调试时,在正确关闭索引之前,可能正在打开索引,但发生异常(或取消正在运行的进程)。如果没有更多的细节,很难说您的具体解决方案是什么,但我建议修复有问题的代码,如果可能的话,不需要打开索引,也不需要显式关闭索引编写器,然后再继续编写其余的代码。

如果您确定一次只使用一个Lucene.Net索引编写器,然后,由于以前未成功的索引写入而发生此异常,该操作将write.lock文件留在索引目录中

解决方案是修改lucene_init()以在创建IndexWriter之前显式解锁索引目录。您的代码可能如下所示:

IndexWriter writer = null;
try {
    writer = new IndexWriter(indexDir, DefaultAnalyzer);
}
catch (LockObtainFailedException ex) {
    DirectoryInfo indexDirInfo = new DirectoryInfo(indexDir);
    FSDirectory indexFSDir = FSDirectory.Open(indexDirInfo, new Lucene.Net.Store.SimpleFSLockFactory(indexDirInfo));
    IndexWriter.Unlock(indexFSDir);
    writer = new IndexWriter(indexDir, DefaultAnalyzer);
}

看来问题出在作家身上。我把它作为一个成员变量,而不是一个函数的作用域。更改此项并使用.Close()完全修复了它。

IIRC只有一个函数写入lucence,我确信该行中不会发生异常。但不管怎样,问题是我再次启动该应用程序,它试图打开lucence,但不知何故它仍然保持着锁。是否有一种方法可以在进程结束时或在再次启动之前终止进程或执行某些操作。事实上,我敢肯定,当我在写bc时,异常从未发生。信息被卡在一个结构中,然后调用函数进行插入,其他什么都没有。所以在写作期间。。。。