使用嵌套/外锁c#
本文关键字:外锁 嵌套 | 更新日期: 2023-09-27 18:11:58
这样写代码可以吗?
lock(syncObject) {
try {
do {
// do some computations
if(this.isStopped) break;
Thread.Sleep(30000);
} while(true);
}
catch(Exception ex) {
Logger.Log.Warn(ex);
}
}
或者将这部分放在while
循环中更好:
// ...
do {
// do some computations
lock(syncObject) {
if(this.isStopped) break;
}
Thread.Sleep(30000);
} while(true);
// ...
将lock
放在循环内部的好处是,这意味着另一个线程可以获得lock
以更改其值。但是,这也可以通过Monitor.Wait
/Monitor.PulseAll
来实现,这意味着您不需要在退出时等待整整30秒。例如:
lock(syncLock) {
try {
do {
// do some computations
if(this.isStopped) break;
Monitor.Wait(syncLock, 30000);
} while(true);
}
catch(Exception ex) {
Logger.Log.Warn(ex);
}
}
并释放它:
lock(syncLock) {
this.isStopped = true;
Monitor.PulseAll(syncLock);
}
在您的第一个示例中,如果您阻止任何其他使用syncObject
的代码运行
在第二个示例中,您可以进入循环,执行一些操作,然后锁定syncObject
并执行检查。这允许syncObject
在循环忙于做其他事情时被其他东西使用。