С конца вопроса:
РЕДАКТИРОВАТЬ: я могу изменить его на необнуляемый при необходимости.
Для не обнуляемых long
, вынужен цикл проверки и обновления (что-то вроде этого):
var current = Interlocked.Read(ref startTime);
while(current > newValue)
{
var other = Interlocked.CompareExchange(ref startTime, newValue, current);
if(other==current) break;
current = other;
}
Вы можете сделать ваши условия while произвольно сложными, они фактически станут вашей if
проверкой.Вам также может потребоваться / необходимо пересчитать newValue
внутри цикла.
Interlocked.Read
возвращает начальное значение.Interlocked.CompareExchange
делает «если значение остается таким же, как когда я последний раз читал значение, зафиксирую свое изменение», а также получает новое текущее значение, если значение изменилось.
Другие вопросы, которые следует учитывать - делатьВы действительно нуждаетесь в этом значении «времени начала», или же на его месте может стоять простое увеличивающееся целое число?Это будет Interlocked.Increment
без циклов и блокировок, поэтому стоит подумать о том, велика ли здесь конкуренция при записи, если вы можете соответствующим образом изменить другие части кода.