私はC#5.0、VS 2012、MVC4を使用しています。従業員情報の検索を実行するときに、従業員データをキャッシュし、キャッシュを照会する必要があるシナリオがあります。
最初はすべての従業員を表示していませんが、すべての従業員をキャッシュするスレッドを開始したいと思いました。だから、ビューが表示されているときのインデックス方式では、これをやっています
//Starting a thread to load the cache if its null
if (HttpRuntime.Cache["AllEmployees"] == null)
{
thCacheAllEmployees = new Thread(new ThreadStart(CacheAllEmployees));
thCacheAllEmployees.Name = "CacheAllEmployees";
thCacheAllEmployees.Start();
}
CacheAllEmployeesは、LDAPを照会し、すべての従業員をキャッシュに格納する別個のメソッドです。LDAPクエリには約15秒かかります。しかし、ビューがロードされ、キャッシュがまだロードされていない最初の15秒以内に、ユーザーが検索ボックスに入力を開始すると、GetFilteredEmployeesアクションメソッドへのajaxメソッド呼び出しを行います。以前に開始したスレッドにアクセスし、そのスレッドが有効かどうかを確認してから、そのスレッドが完了するのを待って、新しいLDAPクエリを再度実行する必要がないようにします。
if (thCacheAllEmployees.IsAlive)
{
thCacheAllEmployees.Join();
if (HttpRuntime.Cache["AllEmployees"] != null)
return (List<CMSUser>)HttpRuntime.Cache["AllEmployees"];
}
しかし、問題は、そのajax呼び出しが新しいメインスレッドであるように見え、thCacheAllEmployeesについて知らない場合です。したがって、thCacheAllEmployeesはnullオブジェクトになります。したがって、アプリケーション内の現在アクティブなすべてのスレッドからこのスレッドのインスタンスを取得する必要があります。
ビューが最初にセッション変数にロードされるときにthCacheAllEmployeesのスレッドIDを格納できますが、ajaxメソッド呼び出しを行うときにスレッドのプールからそのスレッドにアクセスするにはどうすればよいですか?
これを行うためのより良い方法はありますか?提案をお願いします。