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

有时会抛出exception,说文件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 

抛出exception的相关代码是,

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

代码主要来自这篇文章 。

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

问题:哪个其他进程正在使用Lucene.Net索引?

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

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

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