lock 语句和线程同步相关的错误和警告

lock 语句和线程同步相关的一些错误:

  • CS0185“type”不是 lock 语句要求的引用类型。
  • CS1996无法在 lock 语句的正文中等待
  • CS9217不能在异步方法或异步 lambda 表达式中针对“System.Threading.Lock”类型的值使用 lock 语句。

此外,编译器可能会生成与 lock 语句和线程同步相关的以下警告:

  • CS9216将类型为 System.Threading.Lock 的值转换为其他类型时,可能会在 lock 语句中使用意外的基于监视器的锁定。

lock 语句错误

  • CS0185:“type”不是 lock 语句要求的引用类型。
  • CS1996:无法在 lock 语句的正文中等待
  • CS9217:不能在异步方法或异步 lambda 表达式中针对“System.Threading.Lock”类型的值使用 lock 语句。

这些错误表明代码违反了有关语句 lock 的规则:

  • lock 的对象必须是引用类型。 不允许使用值类型。
  • 不能在 lock 语句的作用域中使用 await 表达式。
  • lock 语句不能与 async 方法或 lambda 表达式一起使用。 对于此错误,可以将锁定的对象类型替换为其他类型。 lock 语句使用 Monitor API。

你必须更新代码,以遵循 lock 语句的规则。

lock 警告

  • CS9216:将类型为 System.Threading.Lock 的值转换为其他类型时,可能会在 lock 语句中使用意外的基于监视器的锁定。

从 C# 13 开始,当目标对象是 System.Threading.Lock 对象时,lock 将生成专用代码。 当使用的是 Lock 对象时,编译器将生成此警告,但代码会将其类型转换为其他类型。 因此,编译器将生成常规锁定代码,而不是特定于 Lock 类型的锁定代码。 例如:

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

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

你应确保变量或表达式表示 Lock 对象的类型。