调试时ASP.NET中的锁定问题

时间:2010-10-18 03:45:48

标签: asp.net locking

我正在使用lucence.net,它将文件创建为“锁定”。从我可以告诉它只是创建一个要写入的文件,如果它不能锁定数据库。我得到以下例外

我打电话给lucence_init()除了它发生一次。我在设置当前工作文件夹和其他东西之后在Application_Start中调用它。

我无法判断这种情况何时发生,但我确实知道只有当我在视觉工作室中点击F5时才会发生这种情况。它(显然)从未在第一次发生。当我得到异常,点击停止,修复并尝试运行代码时,我认为它会发生。我需要使用系统托盘中的图标来停止VS网络服务器并重新运行代码(偶尔手动删除锁定文件,但现在我有视觉工作室将其作为后期构建事件。这很奇怪,也许我不需要这部分)

无论如何,由于这个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()

3 个答案:

答案 0 :(得分:3)

好吧,如果您确定一次只使用一个Lucene.Net索引编写器,则会发生此异常,原因是之前的索引写入不成功,这会将write.lock文件保留在索引目录中。 / p>

解决方案是修改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);
}

答案 1 :(得分:0)

Lucene.Net在打开索引时创建一个锁定文件,以便写入。如果索引已打开但未正确关闭,则锁定文件将保留。在进行调试时,可能会在正确关闭索引之前打开索引但发生异常(或者正在取消正在运行的进程)。很难说没有更多细节你的特定解决方案是什么,但我建议修复有问题的代码而不涉及在可能的情况下打开索引或在转移到代码的其余部分之前显式关闭索引编写器。

答案 2 :(得分:0)

似乎问题在于处理作家。我把它作为成员变量而不是具有一个函数的范围。更改此项并使用.Close()完全修复它。