.net 如何在间隔上重新初始化单例对象

.net 如何在间隔上重新初始化单例对象,.net,web-services,asynchronous,singleton,lucene.net,.net,Web Services,Asynchronous,Singleton,Lucene.net,我正在设置一个承载搜索引擎的WCF web服务 为了提高速度,建议使用AzureDirectory的方法是拥有一个可由所有服务调用使用的singletonIndexSearcher实例。以下是我要做的: public class LuceneHelper { private static IndexSearcher _searcher; public static IndexSearcher searcher { get {

我正在设置一个承载搜索引擎的WCF web服务

为了提高速度,建议使用
AzureDirectory
的方法是拥有一个可由所有服务调用使用的singleton
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,在我的工作线程中有一个


我的问题:有没有一种方法可以在我的Web服务中异步运行我的无限“while”语句,或者有没有其他方法可以在不需要客户端调用的情况下重新初始化对象?

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


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

为什么需要每隔一段时间重新打开IndexSearcher?看起来您希望使用Lucene进行近实时搜索,通过提前初始化IndexSearcher,它会缓存索引,这使Lucene.Net尽可能快。我需要重新打开它的原因是为了刷新缓存。将它与IndexWriter.MergedSegmentWarmer结合使用,您就可以为新创建的段执行自定义预热逻辑。@simon svensson我在查找如何使用IndexWriter.SetMergedSegmentWarmer时遇到困难。你能分享一个简单的例子或者一个如何操作的链接吗?谢谢。嘿@SimonSvensson我在将IndexReaderWarmer作为参数传递给SetMergedSegmentWarmer时遇到了一个问题,因为IndexReaderWarmer是一个不可调用的抽象类。我能够继承它,并覆盖一些东西,让它工作。毕竟,取暖器对我没有多大帮助这一点变得很清楚,我可以通过调用IndexWriter.GetReader()或重新打开来实现类似的效果。我可能误解了暖气,但至少它起作用了。谢谢你的跟进。