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);
    }
    ...
}

そのオブジェクトは検索しているインデックスをキャッシュするため、クライアント呼び出しとは非同期に一定間隔でそのオブジェクトを再初期化する必要があります...毎分などです。そこで、これを行う Azure インスタンスの別のスレッドで実行されるプロセスをセットアップしようとしました...

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

私のテストから、どちらも機能していますが、互いに独立していることがわかります。したがって、Web サービスに IndexSearcher があり、ワーカー スレッドに 1 つあると思います。

私の質問: Web サービスで無限の「while」ステートメントを非同期に実行する方法や、クライアントからの呼び出しなしでオブジェクトを再初期化する方法はありますか?

4

1 に答える 1

0

あなたの直接の質問に答えると、はい、while ステートメントを Web サービスのバックグラウンドで実行することができます。Threadクラスのインスタンスを作成し、ループを実行させ、それへの参照をアプリケーションに保存するだけです (シングルトン クラスが適しています)。

そうは言っても、IndexSearcherクラスを開く/閉じる/再度開く必要がないため、これはお勧めしません。推奨される方法は、アプリの存続期間中は共有インスタンスを維持し、メソッドIndexWriterを呼び出してオンデマンドでインスタンスを取得することです (そこから を作成できます)。これは通常、インデックスを再作成するよりもはるかに高速で保守性が高くなります (また、 への呼び出しによってすべての変更がインデックスに反映されるため、リアルタイムでもあります)。GetReaderIndexReaderIndexSearcherGetReader

于 2012-08-27T16:56:35.167 に答える