Вопрос

Я где-то читал, хотя и не помню где, что использование ключевого слова lock в C# может выделять ресурсы.

Я знаю, что попытка заблокировать ValueType приведет к блокировке типа значения, но есть ли другие ситуации?

РЕДАКТИРОВАТЬ::

  1. Кажется, все отвечают на случай Valuetype, я уже знаю это!
  2. Я также знаю, что такое блокировки и как использовать их в большой глубине, общие советы по передовой практике хороши - но бесполезны;)
  3. Мне нужно знать, потому что я строю приложение XNA для развертывания на Xbox.Коллекционер мусора Xbox действительно медленный - это означает, что мне нужно сохранить ассигнования до минимума, предпочтительно отсутствующего (что предотвращает когда -либо работать коллекционером)
Это было полезно?

Решение

Хотя внутреннее выделение блока синхронизации является ленивым (но это деталь реализации, которую IIRC я ​​знаю из «тома 1» Essential.NET, или это CLR через C # - и его следует рассматривать именно так), простой случай предмет, который нужно упаковать в коробку, как вы предлагаете, не возникает - см. Почему lock(<integer var>) не разрешен, а Monitor.Enter(<integer var>) разрешен?

Другие советы

Если вы думали об использовании:

заблокировать (это)

Вы должны знать это, поскольку вы смотрите на свой экземпляр, пользователи вашего класса также могут заблокировать его и испортить вас.Независимо от того, является ли это проблемой, зависит от того, что, по вашему мнению, могут сделать ваши пользователи.Такая же ситуация существует, если вы делаете:

блокировка (тип (MyClass))

Если ты не хочешь этого делать, Вы можете легко выделить статический объект или объект экземпляра (т.е. объект mylock = new Object ()), а затем заблокировать это.

Источник

Что касается блокировки ссылочный тип и тип значения, этот ТАК вопрос о блокировке ресурса при его получении... есть ответ:

Это зависит от типа - если тип ссылки, то да, если тип значения №.Вот почему вы никогда не должны блокировать тип значения, так как тип значения будет в коробке, и любые последующие попытки заблокировать это значение фактически приобретают блокировку на другом объекте.

Определение оператора блокировки:

Заявление о блокировке (Справочник по C#)

Ключевое слово блокировки отмечает блок оператора в качестве критического раздела путем получения блокировки взаимной эксклюзии для данного объекта, выполнения оператора, а затем освобождая блокировку.

Этот ТАК вопрос по ключевому слову блокировки в С# может быть смогу помочь.Вы также можете посмотреть Почему lock() не разрешен, а Monitor.Enter() разрешен?

Спецификация компилятора определяет поведение блокировки такое:

Тип времени компиляции выражения оператора блокировки должен быть параметрам опорного типа или> типа A> типа (§25.1.1), известным как ссылочный тип.Это ошибка времени компиляции для типа времени компиляции выражения для обозначения типа значения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top