我知道他们使用 Interlocked.CompareExchange 是更快\更好的方法,但如果您仅限于锁定,我只是在寻找最佳方法。
还可以安全地根据其先前的值分配一个新的 ProgressStatus 对象(例如,可以“增加” PercentComplete 值)——无需锁定超过一行代码。
编辑:根据@drch 的回答更新了代码。等待看看是否有办法用更小\更有效的锁来做到这一点。这个锁的读、写和新建构造函数都在锁中。希望有一个更小\更有效的锁。谢谢。
class ProgressStatus
{
public readonly int PercentComplete;
public readonly string StatusMessage;
public ProgressStatus(int percentComplete, string statusMessage)
{
PercentComplete = percentComplete;
StatusMessage = statusMessage;
}
}
class Test
{
readonly object _statusLocker = new object();
ProgressStatus _status;
void IncreaseProgress()
{
lock (_statusLocker)
_status = new ProgressStatus(_status.PercentComplete + 10, _status.StatusMessage);
}
}