영어로 읽기

다음을 통해 공유


lock 문 및 스레드 동기화와 관련된 오류 및 경고

lock 문 및 스레드 동기화와 관련된 몇 가지 오류가 있습니다.

  • CS0185: 'type'이 lock 문에서 요구하는 참조 형식이 아닙니다.
  • CS1996: lock 문의 본문에서 기다릴 수 없습니다.
  • CS9217: 'System.Threading.Lock' 형식의 값에 대한 lock 문은 비동기 메서드 또는 비동기 람다 식에서 사용할 수 없습니다.

또한 컴파일러는 lock 문 및 스레드 동기화와 관련하여 다음과 같은 경고를 생성할 수 있습니다.

  • CS9216: 다른 형식으로 변환된 System.Threading.Lock 형식의 값은 lock 문에서 의도하지 않은 모니터 기반 잠금을 사용할 가능성이 높습니다.

lock 문 오류

  • CS0185: 'type'이 lock 문에서 요구하는 참조 형식이 아닙니다.
  • CS1996: lock 문의 본문에서 기다릴 수 없습니다.
  • CS9217: 'System.Threading.Lock' 형식의 값에 대한 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 개체의 형식을 나타내는지 확인해야 합니다.