使用嵌套/外锁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);
// ...

使用嵌套/外锁c#

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在循环忙于做其他事情时被其他东西使用。