与
与 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
对象的类型。