如何在间隔上重新初始化单个对象

时间:2012-08-24 20:18:13

标签: .net web-services asynchronous singleton lucene.net

我正在设置一个托管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'语句,或者在没有来自客户端的电话的情况下重新初始化对象?

1 个答案:

答案 0 :(得分:0)

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

那就是说,我不建议这样做,因为你不需要打开/关闭/重新打开IndexSearcher class。建议的做法是维护应用生命周期内的共享IndexWriter实例,然后调用GetReader method按需获取IndexReader实例(然后您可以从中创建{ {1}})。这通常比重新创建索引更快,更易于维护(并且它也是实时的,因为对IndexSearcher的调用将对索引进行所有更改)。