我正在制作一个很酷的 (imo) T4 模板,这将使缓存更容易。我制作这个模板的一个选项是允许“加载一次”类型的功能,尽管我不确定它有多安全。
基本上,我想这样做,以便您可以执行以下操作:
var post=MyCache.PostsCache.GetOrLockLoad(id, ()=>LoadPost(id));
并且基本上做到了,当必须加载缓存时,它将在PostsCache
. 这样,其他线程将阻塞,直到LoadPost()
函数完成。这使得 LoadPost 只会在每次缓存未命中时执行一次。执行此操作的传统方法是 LoadPost 将在缓存为空的任何时候执行,如果在第一次加载缓存之前有多个请求,可能会执行多次。
这是一件合理的事情,还是因为这种危险或浪费的事情而阻塞其他线程?我在想线程锁定开销大于大多数操作,但也许不是?
有没有人看到过这种事情,这是一个好主意还是危险?
此外,尽管它被设计为在任何缓存和应用程序类型上运行,但它最初的目标是 ASP.Net 的内置缓存机制。