@polyakovyevgeniy

Как обмануть оптимизатор C#?

Есть вот такой код:
public IEnumerable<NodeBase> GetServerSpace(IsoConnectionParameters connectionParameters)
        {
            _isWait = true;
            var worker = new Scsm_MMS_Worker(new Env());
            Task.Factory.StartNew(() =>
            {
                worker.Start(connectionParameters, ReturnIedTree, string.Empty);
                while (_isWait)
                {
                    
                }
            }).Wait();

            worker.Stop();
            return _node;
        }

        private bool _isWait;


В режиме Debug, данный код работает нормально и return вызывается. Но в режиме релиз, цикл while никогда не завершается, и работает бесконечно. Но если в тело цикла while добавть Trace.WriteLine(""), то код тоже отрабатывает хорошо.

public IEnumerable<NodeBase> GetServerSpace(IsoConnectionParameters connectionParameters)
        {
            _isWait = true;
            var worker = new Scsm_MMS_Worker(new Env());
            Task.Factory.StartNew(() =>
            {
                worker.Start(connectionParameters, ReturnIedTree, string.Empty);
                while (_isWait)
                {
                    Trace.WriteLine("");
                }
            }).Wait();

            worker.Stop();
            return _node;
        }


Почему так делает оптимизатор, и как можно все-таки выполнить код нормально не используя Trace.WriteLine в теле цикла?
  • Вопрос задан
  • 288 просмотров
Решения вопроса 1
petermzg
@petermzg
Самый лучший программист
private volatile bool _isWait;
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Sterk
Программист
Понятно что проблему можно решить по другому, но мне кажется вам стоит посмотреть в сторону CancellationTokenSource.
Ответ написан
Комментировать
@Sing303
Вопрос в том, зачем вы так делаете, когда есть ResetEvent`ы
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы