我正在研究ASP.NET MVC应用程序。
我有一个ViewModel类,我试图维护一个计数,以便生成在视图中使用的div ID:
public class ViewModel {
private static uint instanceCount;
private readonly uint id;
public ViewModel(){
id = instanceCount++;
}
public uint DivId
{
get { return id; }
}
}
我是否认为增量并且分配静态成员不是线程安全的,因此在Web应用程序中不安全?
保证这种安全的最佳方法是什么?
感谢。
答案 0 :(得分: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; }
}
答案 1 :(得分: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="div-@i">
<!-- your content here -->
</div>
}
答案 2 :(得分:0)
您可以改用Interlocked.Increment。但是,这仅适用于有符号整数。
答案 3 :(得分:0)
您可以使用System.Threading.Interlocked.Increment()
方法。在您的情况下,这将是正确的选择。有关详细信息,请参阅Interlocked class。