gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:50:51 26 4
gpt4 key购买 nike

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

代码大部分来自this article .

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

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

最佳答案

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

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

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

关于c# - 为什么 Lucene.Net 索引器抛出 System.IO.IOException 未处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15013032/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com