静态成员变量和线程安全性

时间:2011-06-28 11:24:46

标签: c# asp.net-mvc thread-safety

我正在研究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应用程序中不安全?

保证这种安全的最佳方法是什么?

感谢。

4 个答案:

答案 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