2014-01-07 23 views
0

看着下面的CRUD代碼,我想知道這是否是真的有必要使用鎖,如果他們可以簡單地省略:這是推薦使用C#中的鎖嗎?

private static readonly object Lock = new object(); 

    /// <summary> 
    /// Returns all contacts in the list. 
    /// GET /Contacts/ (Content-Type:application/json) 
    /// </summary> 
    [ActionName("Index"), AcceptVerbs(HttpVerbs.Get), IsAjaxRequest(true)] 
    public ActionResult GetAll() 
    { 
     lock (Lock) 
     { 
      return new JsonWithStatusCodeResult(HttpStatusCode.OK, Contacts); 
     } 
    } 

    /// <summary> 
    /// Returns the contact with the provided ID. 
    /// Get /Contacts/{id} 
    /// </summary> 
    [ActionName("Item"), AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult GetById(Guid id) 
    { 
     lock (Lock) 
     { 
      var index = Contacts.FindIndex(x => x.Id == id); 
      if (index < 0) 
      { 
       ModelState.Clear(); 
       ModelState.AddModelError("Id", "The provided ID does not exist in the collection"); 
       return InvalidModelStateFilterAttribute.GetErrorResult(HttpStatusCode.NotFound, ModelState); 
      } 

      return new JsonWithStatusCodeResult(HttpStatusCode.OK, Contacts[index]); 
     } 
    } 

僅供參考 - 這是來自一個項目,我在看代碼,並想知道在這種情況下是否有合乎邏輯的理由使用鎖。

謝謝。

+0

看起來很隨機給我。 'Contacts'全局對象(對於ASP.Net來說很奇怪)或者是從其他線程更新(再也沒有代碼顯示這種情況)? –

+0

你爲什麼鎖定?您的請求將在單獨的線程中處理,您似乎沒有共享任何內容。聯繫人是數據庫的上下文嗎? – xxbbcc

+1

如果您的Contacts變量不是線程安全的,那麼這些鎖將確保它們不會被不同線程同時使用。除此之外,我們需要更多詳細信息來告訴「推薦」... –

回答

0

任何局部變量都不需要鎖定 - 如果您正在創建一個新類型的本地實例,那麼除非您專門將它們傳遞給其他線程,否則該變量將不會被任何其他線程共享。

編輯:正如邁克爾·岡瑟指出的那樣,我在GetAll()方法錯過Contacts - 就像與GetByID(),如果Contacts是一個靜態對象,如果它的線程之間以某種方式傳遞,它需要鎖定,否則它不。

您的GetByID()可能需要一些鎖定,但如果不知道所有使用的對象,很難說。 Contacts似乎是一個全局變量或成員變量,但是對鎖定的需要取決於它是否是靜態的或者它是否被傳遞給其他線程。從代碼提取中很難說。雖然 - 在ASP.NET應用程序中非常罕見,您需要一個真正的全局數據 - 大多數全局數據應該存儲在數據庫中或者它應該是不變的(在這種情況下,您將它初始化爲一個全局/靜態靜態構造函數,然後只有後來纔讀取,所以沒有必要鎖定)。

+1

'GetAll()'可能需要鎖定,具體取決於它與'Contacts'的關係,我假設它是'this'的一個屬性。 –

+0

@MichaelGunter是的,你是對的。我錯過了代碼中的Contact。 :)我會更新答案 - ty。 – xxbbcc

相關問題