Поделиться через


Ошибки и предупреждения, связанные с инструкцией lock и синхронизацией потоков

Существует несколько ошибок , связанных с инструкцией lock и синхронизацией потоков:

  • CS0185: тип не является ссылочным типом, как это требуется оператором блокировки.
  • CS1996: не удается ожидать в тексте оператора блокировки
  • CS9217: оператор блокировки для значения типа System.Threading.Lock нельзя использовать в асинхронных методах или асинхронных лямбда-выражениях.

Кроме того, компилятор может создать следующее предупреждение, связанное с lock операторами и синхронизацией потоков:

  • CS9216: значение типа, преобразованного в другой тип System.Threading.Lock , будет использовать, скорее всего, непреднамеренное блокировка на основе монитора в lock инструкции.

Ошибки инструкции блокировки

  • CS0185: тип не является ссылочным типом, как это требуется оператором блокировки.
  • CS1996: не удается ожидать в тексте оператора блокировки
  • CS9217: оператор блокировки для значения типа System.Threading.Lock нельзя использовать в асинхронных методах или асинхронных лямбда-выражениях.

Эти ошибки указывают на то, что код нарушает правила, касающиеся lock инструкции:

  • Объект, который является lockобъектом, должен быть ссылочным типом. Типы значений не допускаются.
  • Выражение await нельзя использовать в область инструкцииlock.
  • Оператор lock нельзя использовать с async методами или лямбда-выражениями. Для этой ошибки можно заменить тип объекта, заблокированного другим типом. Инструкция lock использует Monitor API.

Необходимо обновить код, чтобы следовать правилам инструкции lock .

Предупреждение о блокировке

  • CS9216: значение типа, преобразованного в другой тип System.Threading.Lock , будет использовать, скорее всего, непреднамеренное блокировка на основе монитора в lock инструкции.

Начиная с C# 13, lock создается специализированный код, когда целевой System.Threading.Lock объект является объектом. Компилятор создает это предупреждение при использовании Lock объекта, но код преобразует его тип в что-то другое. Поэтому компилятор создает общий код блокировки, а не код блокировки, характерный для Lock типа. Например:

object lockObject = new System.Threading.Lock();

lock (lockObject) // CS9216
{
    // .. Your code
}

Необходимо убедиться, что переменная или выражение представляет тип Lock объекта.