BEGIN LOCK 和 END LOCK 关键字将语句块标记为关键部分。
BEGIN LOCK object
statements
END LOCK
object | 一个表达式,其求值指向一个用作锁定对象的对象引用。 |
statements | 一个或多个语句或表达式,这些语句或表达式受 object 中指定的对象的互斥锁保护。 |
BEGIN LOCK ... END LOCK 确保多个线程不能同时执行代码块中的语句。如果一个线程正在执行代码块中的代码,任何试图进入代码块的其他线程都将被暂停,直到正在执行的线程离开代码块。
用作锁定对象的对象必须是引用类型,不能是值类型,表达式不能求值为 NULL,否则会出现运行时错误。
BEGIN LOCK ... END LOCK 使用 Monitor.Enter() 和 Monitor.Exit() 来获取和释放指定对象上的锁。示例如下:
BEGIN LOCK lockObj
? "在警卫区"
END LOCK
等价于
System.Threading.Monitor.Enter( lockObj )
TRY
? "在警卫区"
FINALLY
System.Threading.Monitor.Exit( lockObj )
END TRY
建议使用 BEGIN LOCK ... END LOCK,而不是直接使用 Monitor(监视器) 类,因为这样代码更简洁,即使在保护块内出现异常,也能确保 Monitor(监视器) 对象被释放。
BEGIN LOCK ... END LOCK 提供的功能类似于 Windows API 函数 EnterCriticalSection() 和 LeaveCriticalSection()。不过,锁定对象可以使用任何引用类型的实例,而不是使用由 InitializeCriticalSection() 创建的对象。
有关详细信息,请参阅 System.Threading.Monitor 类的文档。