1

我正在设置一个托管Lucene.Net / AzureDirectory搜索引擎的 WCF Web 服务。

出于速度目的,推荐的使用方法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);
    }
    ...
}

由于该对象缓存了它正在搜索的索引,因此我需要以与任何客户端调用异步的间隔重新初始化该对象......就像每分钟左右一样。因此,我尝试在我的天蓝色实例上的另一个线程中设置一个运行该进程的进程...

LuceneHelper.initSearcher();
while (true)
{
    Thread.Sleep(60000);
    LuceneHelper.initSearcher();
}

从我的测试中我可以看出它们都在工作,但彼此独立。所以我猜我的网络服务中有一个 IndexSearcher,我的工作线程中有一个。

我的问题:有没有办法在我的 web 服务中异步运行我的无限“while”语句,或者以任何其他方式在没有客户端调用的情况下重新初始化对象?

4

1 回答 1

0

回答您的直接问题,是的,可以在您的 Web 服务的后台运行 while 语句。您所要做的就是创建Thread该类的一个实例并让它运行您的循环并将对它的引用存储在您的应用程序中(您的单例类将是一个好地方)。

也就是说,我不建议这样做,因为您不需要打开/关闭/重新打开IndexSearcher课程。推荐的做法是在您的应用程序的整个生命周期中维护一个共享IndexWriter实例,然后调用该GetReader方法IndexReader按需获取一个实例(然后您可以从中创建一个IndexSearcher. 这通常比重新创建索引更快且更易于维护(而且它也是实时的,因为调用GetReader将对索引进行所有更改)。

于 2012-08-27T16:56:35.167 回答