내가 얻을 관리했습니다이 내가 프로젝트에 대한 쓴 작은 헬퍼 클래스의 도움으로 잘 작동합니다. 아래 팩토리 클래스는 임의의 수의 스레드로 단일 indexReader를 공유하고 GetCurrentReader()에서 반환 된 판독기가 인덱스 상태와 동기화되도록합니다.
class IndexReaderFactory :
IDisposable
{
public IndexReaderFactory(bool isReadonly)
{
this.isReadonly = isReadonly;
}
IndexReader reader;
readonly ReaderWriterLockSlim rwl = new ReaderWriterLockSlim();
private readonly bool isReadonly;
/// <summary>
/// Returns a reader that isCurrent
/// </summary>
public IndexReader GetUpToDateReader()
{
rwl.EnterUpgradeableReadLock();
try
{
if (reader == null)
{
rwl.EnterWriteLock();
try
{
if (logger.IsInfoEnabled)
logger.Info("Creating IndexReader on directory {0}", AppSettingsBase.LucenePostIndexLocation);
reader = IndexReader.Open(FSDirectory.Open(AppSettingsBase.LucenePostIndexLocation), isReadonly);
}
finally
{
rwl.ExitWriteLock();
}
}
else if(!reader.IsCurrent())
{
rwl.EnterWriteLock();
try
{
if (logger.IsInfoEnabled)
logger.Info("IndexReader is not current. Re-opening");
reader = reader.Reopen();
}
finally
{
rwl.ExitWriteLock();
}
}
}
finally
{
rwl.ExitUpgradeableReadLock();
}
return reader;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public void Dispose(bool disposing)
{
if (disposing)
{
// get rid of managed resources
}
if(reader != null)
reader.Dispose();
}
}
색인이 현재 작성된 경우 독자를 여는 것이 실패한다고 생각하십니까? –
@OliverWeichhold 글쎄, 아마도 실패하지는 않겠지 만 독자가 색인이 없거나 일관성이없는 상태가 될 수 있습니다. 나는 자물쇠가 독자들에게 어떻게 영향을 미치는지 실제로 기억하지 못한다. – jishi