为什么每次调用Value时我的Lazy <t>都会重新初始化?

时间:2018-01-09 22:55:46

标签: c# asp.net .net asp.net-mvc lazy-evaluation

我有我的控制器成员

    private Lazy<MyCache> loadedComponentCache = new Lazy<MyCache>(() =>
    {
        MyCache instance = MyCacheb.Instance;
        instance.LoadStuffAsync().Wait();
        return instance;
    }, LazyThreadSafetyMode.PublicationOnly);

我正在使用懒惰调用一个长时间运行的方法LoadAsync(),只有在用户访问该页面后命中某个API端点时才需要调用该方法。

    [HttpGet]
    public ActionResult GetStuff()
    {
        var results = from component in loadedComponentCache.Value.All()
                      // ... 
    }

任何想法为什么每次API端点被击中时它都会重新加载?我的理解是,只有当用户访问页面时才会创建我的控制器实例,因此每个访问该页面的用户每次API调用只会触发一次。

1 个答案:

答案 0 :(得分:0)

您可以将loadedComponentCache设为静态,但这并不理想。如果您使用的是IoC容器,则可以将其注册为单例。尽管可能,但通常应避免使用这些长寿命物体。

如果您确实需要这个长期存储缓存,那么您应该考虑使用类似Redis的东西,它是针对这种情况设计和优化的,并且可以分布在多个节点上。 https://redis.io/topics/introduction