2011-06-07 53 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。這意味着所有線程都獲得相同的值,但可能意味着重複的工作(除第一個之外的所有線程均被丟棄)。

如果有可能發生這種情況,我實際上會使用一個靜態字段初始值設定項,因爲它具有較少的運行時間開銷;那麼不需要鎖定。