2011-06-28 40 views
1

我正在研究ASP.NET MVC應用程序。靜態成員變量和線程安全

我有一個視圖模型類而我試圖保持一個計數,以產生div編號它們在視圖中使用:

public class ViewModel { 

    private static uint instanceCount; 
    private readonly uint id; 

    public ViewModel(){ 
     id = instanceCount++; 
    } 

    public uint DivId 
    { 
     get { return id; } 
    } 
} 

我是在想增加和分配的靜態成員是正確的不是線程安全的,因此在Web應用程序中不安全?

使這個安全的最好方法是什麼?

謝謝。

回答

2

我正確的想法遞增和分配靜態成員不是線程安全的,因此在Web應用程序中不安全嗎?

是的,你是正確的想到這一點。

爲了安全起見,最好的方法是什麼?

通過同步訪問:

public class ViewModel 
{ 
    private static uint instanceCount; 
    private readonly uint id; 
    private static object _syncRoot = new object(); 

    public ViewModel() 
    { 
     lock(_syncRoot) 
     { 
      id = instanceCount++; 
     } 
    } 

    public uint DivId 
    { 
     get { return id; } 
    } 
} 

或簡單地用一個Guid

public class ViewModel 
{ 
    public ViewModel 
    { 
     DivId = string.Format("id_{0}", Guid.NewGuid()); 
    } 

    public string DivId { get; private set; } 
} 
+0

感謝您的回答。我最初考慮過一個Guid,但不喜歡所產生的ID的長度。我現在決定保持簡單並使用Guid。我因此獲得了一些有關靜態和線程的知識 - 乾杯! – TonE

1

我要問,爲什麼你不能只是處理這個視圖中:

public ActionResult Index() { 
    var models = SomeService.GetModels(); // returns IEnumerable<YourViewModel> 
    return View(models); 
} 

// in your view 

@for (int i = 1; i == Model.Count(); i++) { 
    <div id="[email protected]"> 
     <!-- your content here --> 
    </div> 
} 
+0

該視圖允許編輯一個可以動態添加的嵌套集合 - 我不知道會有多少個模型。 – TonE

+0

你不需要事先知道。這就是Model.Count()的用途(假設你的Model是一個集合) –

+0

但是如果項目使用ajax/javascript動態添加到列表中?我想另一種選擇是使用javascript來計算添加新行時現有行的數量。 – TonE

0

可以使用System.Threading.Interlocked.Increment()方法。在你的情況下,這將是正確的選擇。有關更多信息,請參閱Interlocked class