为什么Lucene.Net索引器抛出System.IO.IOException未得到处理

本文关键字:IOException IO 处理 System Net Lucene 索引 为什么 | 更新日期: 2023-09-27 18:00:24

有时会抛出异常,称文件write.lock无法使用,因为它正被另一个进程使用,但这是Lucene.Net的一个非常简单的测试应用程序,没有其他进程使用它,不知道这可能是

异常详细信息如下:

System.IO.IOException was unhandled
HResult=-2147024864
Message=The process cannot access the file 
     'c:'temp'luceneidx'write.lock' because it is being used by another process.
Source=mscorlib
StackTrace:
    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
    at System.IO.File.InternalDelete(String path, Boolean checkHost)
    at System.IO.File.Delete(String path)
    at Lucene.Test.LuceneSearchInternal.get__directory() 
    in C:'Lucene.Test'LuceneSearchResumes.cs:line 35

引发异常的相关代码是,

var lockFilePath = Path.Combine(_luceneDir, "write.lock");
if (File.Exists(lockFilePath))
    File.Delete(lockFilePath);   // THROWS exception sometimes

代码主要来自本文。

索引是使用Task.Factory.StartNew()在后台线程上构建的,WPF GUI在构建索引时进行搜索。只有一个线程将文档写入索引。

问题:还有哪个进程在使用Lucene.Net索引?

为什么Lucene.Net索引器抛出System.IO.IOException未得到处理

假设所提供的代码与搜索过程(而不是索引过程)相关,则不应该每次尝试访问索引时都试图删除锁定文件。抛出异常是因为后台线程当前正在向索引写入,并且当线程本身应该处理删除时,您正任意尝试删除其锁定文件。

在您发表的文章中,此机制用于在编写索引时系统/应用程序崩溃后恢复Lucene索引,使其锁定。然而,这种情况并不常见。我相信,在CodeProject的文章中,它假设了对索引的单线程访问,因此它采用了这种方法。

在您的项目中,您需要能够检查锁定文件的存在是由于当前写入访问还是由于以前的应用程序/系统崩溃。您可以在代码中使用lock对象来区分这两种情况,该对象在发生崩溃时会动态释放。