C# 如何在第一次请求时从数据库加载一些数据,但防止其他调用(同时)在.NET中也这样做?

C# 如何在第一次请求时从数据库加载一些数据,但防止其他调用(同时)在.NET中也这样做?,c#,.net,lazy-loading,lazy-evaluation,lazy-initialization,C#,.net,Lazy Loading,Lazy Evaluation,Lazy Initialization,我有一个类,它作为一个单例在依赖项注入中注册,因此只有一个实例/这个类的同一个实例被注入到我的MVC控制器中 在这个类中,我有一个方法可以做到这一点: 仅在第一次调用此方法时将数据从文件/数据库加载到RAM中。e、 g.所有国家的名字,或电影中所有人的名字,等等 现在对RAM中的数据集合执行一些非常简单的文本查询 这里的要点是,我只需要加载一次数据。这是我的代码,顺便说一句 public string Foo(ISession dbSession) { LoadDataFromFil

我有一个类,它作为一个单例在依赖项注入中注册,因此只有一个实例/这个类的同一个实例被注入到我的MVC控制器中

在这个类中,我有一个方法可以做到这一点:

  • 仅在第一次调用此方法时将数据从文件/数据库加载到RAM中。e、 g.所有国家的名字,或电影中所有人的名字,等等
  • 现在对RAM中的数据集合执行一些非常简单的文本查询
这里的要点是,我只需要加载一次数据。这是我的代码,顺便说一句

public string Foo(ISession dbSession)
{
    LoadDataFromFileOrDbOrWherever();

    return GetAnswer(_data);
}
你明白了。其要点是该方法必须提供当前数据库会话。这就是我的致命之处:(我正在考虑使用
Lazy
并在构造函数中执行此操作……但是我需要将ISession传递到构造函数中,而我实际上还没有这样做

那么,人们在这里的常见模式是什么,只在第一次通话中获取一些数据,记住……然后从现在开始引用它

如果同时发出两个或三个调用,我希望第二个/3个/etc调用阻塞/等待,直到第一个调用完成数据加载过程

起初我想到了双重检查锁定……但现在这是一种有点反模式的模式,因为.NET有一个很好的
Lazy

有什么想法吗,善良的人们?

您可以使用它来执行您想要的方法一次,并在您再次调用它时提供缓存结果

using LazyCache;

IAppCache cache = new CachingService();
return await cache.GetOrAddAsync<ILoadChartStorageInformation[]>
(key, (Func<Task<ILoadChartStorageInformation[]>>) (async () =>
{
    return await someFunction();
}
使用LazyCache;
IAppCache cache=new CachingService();
return wait cache.GetOrAddAsync
(键,(Func)(异步()=>
{
return wait someFunction();
}
请参阅LazyCache文档以获取更详细的文档:

这听起来是使用Task和async的理想场所。先进行InitAsync,然后所有其他操作都会等待它完成。我记得创建者曾讨论过类似的问题。找到了