почему проблема больше не воспроизводится, когда я изменяю условие while и ставлю «while (true)» вместо «while (! Stop)»?
Поведение зависит от нескольких факторовнапример: аппаратное обеспечение, операционная система, среда выполнения ... Например, на моей машине проблема не воспроизводится даже с вашим исходным кодом с while (!stop)
.И я считаю, что проблема может быть воспроизведена с while (true)
в другой среде.
Эрик Липперт и Джон Скит заявляют, что нам не нужно использовать такие низкоуровневые методы, как Thread.MemoryBarrier
, если только мы не являемся настоящими экспертами в этой области ( ссылка # 1 и ссылка # 2 ).Возможно, вам стоит подумать об использовании ключевого слова volatile
с объявлением stop
, которое выражает ваше намерение более четко и позволяет вам не использовать Thread.MemoryBarrier
Или даже подумайте об использовании Task
с CancellationToken
, чтобы иметь возможность отменить Task
.
Если посмотреть на ваше имя пользователя, то стоит отметить, что Эрик Липперт и Джон Скит в отношении .net
похожи на Гэндальфа в отношениимагия
Обновление
Прочитайте комментарии Эрика Липперта ниже.Не используйте volatile
, а также Thread.MemoryBarrier
, пока действительно не понадобится.