2011-06-07 55 views
2

我有下面的代码,我想知道如果我需要一个锁:CompiledQuery.Compile需要锁(EF4时,SQL Server,C#)

私有静态函数功能 _GetAccountAttributeGroup;

公共静态AccountAttributeGroup GetAccountAttributeGroup(这 AcbsContainer ObjectContext的,长的ID?)

{ 
     if (id == null) 
     { 
      return null; 
     } 

     if (_GetAccountAttributeGroup == null) 
     { 
      _GetAccountAttributeGroup = CompiledQuery.Compile<AcbsContainer, 
      long, AccountAttributeGroup>((ctx, key) => 
      ctx.AccountAttributeGroups.FirstOrDefault(e> => e.Id == key)); 
     } 

     return _GetAccountAttributeGroup(objectContext, id.Value); 
    } 

回答

2

我可能做到这一点与仔细检查(即检查是否空;如果为空,锁定和再次检查;如果仍然为空,则进行编译和赋值工作)。但是,这主要是为了防止在冷启动时重复工作。

如果工作量很小(即不足以编译),我可能会使用一个局部变量来完成这项工作,然后使用Interlocked.CompareExchange来分配if(且仅当)该字段仍为null。这意味着所有线程都获得相同的值,但可能意味着重复的工作(除第一个之外的所有线程均被丢弃)。

如果有可能发生这种情况,我实际上会使用一个静态字段初始值设定项,因为它具有较少的运行时间开销;那么不需要锁定。