Переменная статического члена и безопасность потока - PullRequest
1 голос
/ 28 июня 2011

Я работаю над приложением ASP.NET MVC.

У меня есть класс ViewModel, для которого я пытаюсь поддерживать счетчик для генерации идентификаторов деления, которые используются в представлении:

public class ViewModel {

    private static uint instanceCount;
    private readonly uint id;

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

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

Правильно ли я считаю, что приращение и назначение статического элемента не безопасны для потока и, следовательно, небезопасны в веб-приложении?

Каков наилучший способ обеспечить безопасность?

Спасибо.

Ответы [ 4 ]

2 голосов
/ 28 июня 2011

Правильно ли я считаю, что приращение и назначение статического элемента не является потокобезопасным и, следовательно, небезопасным в веб-приложении?

Да, вы правы, думая так.

Каков наилучший способ сделать это безопасным?

Синхронизируя доступ:

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 голос
/ 28 июня 2011

Я должен спросить, почему вы не можете просто справиться с этим с вашей точки зрения:

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>
}
0 голосов
/ 28 июня 2011

Вы можете использовать System.Threading.Interlocked.Increment() метод. Это будет правильный выбор в вашем случае. См. Класс блокировки для получения дополнительной информации.

0 голосов
/ 28 июня 2011

Вместо этого вы можете использовать Interlocked.Increment . Однако это работает только с целым числом со знаком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...