В статье, которую вы упомянули, только требование блокировки на одной строке ссылалось на продвинутую технику позже в Part 5 .
Относительно кода, который вы имеете выше, возможно получить условие гонки между вашими двумя замками. Два потока могут прочитать одно и то же значение, а затем записать одно и то же значение, когда желаемый результат будет иметь их оба приращения.
Блокировка для всего чтения и записи:
lock (_statusLocker) {
statusCopy = _status;
var newStatus = new ProgressStatus(statusCopy.PercentComplete + 10, statusCopy.StatusMessage);
_status = newStatus;
}
Или просто:
lock (_statusLocker) {
_status = new ProgressStatus(_status.PercentComplete + 10, _status.StatusMessage);
}