【发布时间】:2018-06-19 01:24:54
【问题描述】:
我有一个控制器成员
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 调用只会点击一次。
【问题讨论】:
-
为每个请求创建一个新的控制器实例。因此,您的
Lazy会为每个请求有效地重新创建。 -
@zaitsman 谢谢。如何让它在每次页面访问时初始化一次?
-
“每页访问一次”是什么意思?每个请求都是一个
page visit。所以你正在这样做...... -
可能@Questionaire 使用“访问”作为“会话”的意思。在这种情况下,您需要添加一个(惰性)MyCache 实例作为
Session项目 -
你有一个无状态的应用程序,如果你不为每个请求初始化它,你怎么能使用
loadedComponentCache。如果您只想在整个应用程序生命周期中初始化一次,可以将其设为单例或静态。
标签: c# asp.net .net asp.net-mvc lazy-evaluation