【发布时间】:2013-02-07 09:54:31
【问题描述】:
有时会抛出异常,说文件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.Net 支持多线程,因此您的后台线程可以在您的 WPF 线程搜索时构建索引(我认为这称为“实时”搜索)。即使您不搜索,WPF 线程也可能在后台线程尝试删除锁之前打开了索引;这是一个可能的原因。
-
需要拨打
File.Delete。这是FSDirectory对象的健全性检查getter 的一部分;我认为它会检查锁定文件,以防某些进程在未解锁索引的情况下提前崩溃。我没有检查 CodeProject 代码,但我认为它可以工作并且你已经更改了它。可能最简单的解决方法是确保所有线程(后台线程、WPF 线程)使用相同的FSDirectory对象。 -
我只是快速阅读了 CodeProject 的那篇文章,这东西充满了失败。我绝对不会参考它来学习 Lucene 的基础知识。它不遵循文档/字段实例重用等基本最佳实践,它不断关闭 IndexWriters/IndexSearchers 等。
-
我同意@JfBeaulac:你最好从最初的 Lucene 项目中学习,该项目在概念和代码上都与 Lucene.Net 有很多相似之处。查看this tutorial。
-
@rae1n 链接的教程是一个非常好的起点。如果可以的话,我还建议您获取 Lucene in action 一书。它包含您需要了解的所有内容 + 可免费下载的精彩代码示例:manning-source.com/books/hatcher2/LuceneInAction.zip
标签: c# .net visual-studio-2010 lucene lucene.net