1

我正在使用 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 方法调用时如何从线程池访问该线程?

有没有更好的方法来做到这一点?请给你的建议。

4

2 回答 2

0

当您认为线程认为操作而不是数据时。当您要存储数据时,您不会将该数据放在线程上,而是将其放入内存中,然后根据范围,一个或多个线程可以访问该内存。

有很多方法可以存储这些数据。我不确定要缓存的数据对于不同的用户会话是否是唯一的,或者您是否只需要一个全局缓存。任何你想从任何地方访问的东西都可以放在一个静态变量中。您只需要确保使用锁,这样多个线程就不会尝试同时访问该数据,这是不安全的。


模型

public static class MyCache
{
     private static object LockToken = new object(); 
     private static List<CMSUser> _Users { get; set; }

     static MyCache()
     {
        _Users = GetUsers();
     }

     public static List<CMSUser> Users
     {
          lock (LockToken)
          {
               return _Users;
          }
     }
}

控制器

public class UsersController : ApiController
{
    public List<CMSUser> Get()
    {
        return MyCache.Users;
    }
}

看法

$.ajax({
    url: '/api/users',
    dataType: 'json',
    success: function(users) {
        // do something with users here
    }
});
于 2012-11-08T04:27:55.047 回答
0

为什么要等待第一次调用缓存数据?您可以在应用程序启动期间通过将其添加Application_StartGlobal.asax.

这意味着当您的应用程序启动时您将有 15 秒的开销,但之后您就可以开始了。

如果你也想在这里使用一个线程,你可以把它的 id 放在一个静态变量中,并用它来检查列表是否已经加载。

于 2012-11-08T04:17:43.280 回答