我正在使用 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 并将所有员工存储在 Cache 中。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 将是空对象。所以我需要从应用程序中当前所有活动线程中获取该线程的实例。
第一次在会话变量中加载视图时,我可以存储 thCacheAllEmployees 的线程 ID,但是在进行 ajax 方法调用时如何从线程池访问该线程?
有没有更好的方法来做到这一点?请给你的建议。