我正在设置一个托管Lucene.Net / AzureDirectory搜索引擎的WCF网络服务。
出于速度目的,建议使用AzureDirectory
的方法是拥有一个可供所有服务调用使用的单例IndexSearcher
实例。以下是我必须做的事情:
public class LuceneHelper
{
private static IndexSearcher _searcher;
public static IndexSearcher searcher
{
get
{
if (_searcher == null)
initSearcher();
return _searcher;
}
}
public static void initSearcher()
{
_searcher = new IndexSearcher(azureDirectory);
}
...
}
由于该对象缓存了它正在搜索的索引,我需要在一个间隔内从任何客户端调用异步重新初始化该对象...就像每分钟左右一样。所以我尝试在我的azure实例上设置一个在另一个线程中运行的进程来执行此操作...
LuceneHelper.initSearcher();
while (true)
{
Thread.Sleep(60000);
LuceneHelper.initSearcher();
}
我可以从我的测试中看出,他们两个都在工作但彼此独立。所以我猜我的Web服务中有一个IndexSearcher,而我的工作线程中有一个。
我的问题:有没有办法在我的网络服务中以异步方式运行我的无限'while'语句,或者在没有来自客户端的电话的情况下重新初始化对象?
答案 0 :(得分:0)
回答您的直接问题,是的,可以在您的Web服务的后台运行while语句。您所要做的就是创建一个Thread
class的实例,让它运行您的循环并在您的应用程序中存储对它的引用(您的单例类将是一个好地方)。
那就是说,我不建议这样做,因为你不需要打开/关闭/重新打开IndexSearcher
class。建议的做法是维护应用生命周期内的共享IndexWriter
实例,然后调用GetReader
method按需获取IndexReader
实例(然后您可以从中创建{ {1}})。这通常比重新创建索引更快,更易于维护(并且它也是实时的,因为对IndexSearcher
的调用将对索引进行所有更改)。