在ASP.NET MVC项目中,我们有几个数据实例需要大量资源和时间来构建.我们想要缓存它们.
MemoryCache提供一定程度的线程安全性但不足以避免并行运行多个构建代码实例.这是一个例子:
var data = cache["key"];
if(data == null)
{
data = buildDataUsingGoodAmountOfResources();
cache["key"] = data;
}
Run Code Online (Sandbox Code Playgroud)
正如您在繁忙的网站上看到的那样,数百个线程可以同时进入if语句,直到构建数据并使构建操作更慢,不必要地消耗服务器资源.
AddOrGetExisting在MemoryCache中有一个原子实现,但它错误地需要"值来设置"而不是"代码来检索要设置的值",我认为这使得给定的方法几乎完全没用.
我们一直在MemoryCache周围使用我们自己的ad-hoc脚手架来实现它,但它需要明确的locks.使用每个条目的锁定对象很麻烦,我们通常会通过共享远离理想的锁定对象来逃避.这让我觉得避免这种惯例的理由可能是故意的.
所以我有两个问题:
不lock建立代码是一种更好的做法吗?(对于一个人来说,这可能已被证明更具响应性,我想知道)
对于这样的锁,实现MemoryCache的每个条目锁定的正确方法是什么?使用key字符串作为锁定对象的强烈冲动在".NET锁定101"中被忽略.
硒.
我下载了C#客户端驱动程序和IDE.我设法记录了一些测试并成功地从IDE运行它们.但现在我想用C#做到这一点.我将所有相关的DLL(Firefox)添加到项目中,但我没有这个Selenium类.一些你好世界会很好.
使用这种模式有什么好处或原因?
public sealed class myStaticClass
{
private static bool _initialized;
private static object _lockObject;
private static string _someStaticField;
private static int _anotherStaticField;
private static string _nthStaticField;
static myStaticClass()
{
_initialized = false;
_lockObject = new object();
}
public myStaticClass()
{
}
public static void Initialize()
{
if(!_initialized)
{
lock(_lockObject)
{
if(!_initialized)
{
//do initializing
_someStaticField = someApplicationSetting;
_anotherStaticField = anotherApplicationSetting;
_nthStaticField = nthApplicationSetting;
_initialized = true;
}
}
}
}
public static string NthStaticField
{
get {
Initialize();
return _nthOtherField; …Run Code Online (Sandbox Code Playgroud)