170 похожих чатов

Доброе утро в классе есть поле public bool Ready { get; set;

}


далее есть задача

Ready = false;
Task.Run(DoTask);

async Task DoTask()
{
while (!Ready) ;
//..do the task
}


и далее извне в какой-то момент Ready = true;
в релизной конфигурации DoTask никогда не завершается почему-то, раньше такой проблемы не было
помогло только такое решение while (!Ready) await Task.Delay(500);

вопрос, почему так может быть?

21 ответов

12 просмотров

ты ждешь выполнения таска?

entdark
да

тогда await Task.Run()

entdark- Автор вопроса
Oleg Harasment
тогда await Task.Run()

так не могу, надо запустить и забыть

entdark
так не могу, надо запустить и забыть

а как ты понимаешь, что таск не завершается?

entdark- Автор вопроса
Oleg Harasment
а как ты понимаешь, что таск не завершается?

так, что не выполняются действия после комментария //..do the task

кароче, у тебя, наверно, компиллятор выкидывает while() без delay, и таск завершается сразу после запуска

entdark- Автор вопроса

у меня, кстати, runtime monodroid

Ilspy и смотри что там, а вообще, это решение говно, делай на ивентах или хотя бы TaskCompletionSource

entdark- Автор вопроса

Плохой код.

Используй CancellationToken, и проблемы не будет. А код плох потому, что он не следует модели памяти. И поэтому в многопоточном сценарии тут может быть буквально что угодно.

entdark- Автор вопроса
entdark
что значит не следует модели памяти?

А ты почитай про неё. У тебя у одной и той же переменной в разных потоках чтение и запись без барьеров. Это вообще фуфуфу такое делать.

entdark- Автор вопроса
Dr. Friedrich von Never
А ты почитай про неё. У тебя у одной и той же пере...

так а что конкретно-то читать? тема проблемы как называется?

entdark- Автор вопроса

проблема создала компиляция с LLVM: https://docs.microsoft.com/en-us/xamarin/android/deploy-test/release-prep/?tabs=windows#llvm-optimizing-compiler ещё беглое гугление показало, что у многих вообще приложения падали из-за этого, у меня ещё простой случай

entdark- Автор вопроса
Dr. Friedrich von Never
Используй CancellationToken, и проблемы не будет. ...

почитал, мой частный случай не затрагивает проблему модели памяти, так как момент, когда запускается Task, у меня переменная всегда false уже это, конечно, не отменяет факта того, что надо переписать

entdark
почитал, мой частный случай не затрагивает проблем...

Очень классно, когда люди думают о проблеме, ты молодец. Но тогда непонятно, чо оно не работает :)

т.е. вот это: Ready = false; Task.Run(DoTask); async Task DoTask() { while (!Ready) ; //..do the task } в одном методе?

entdark- Автор вопроса
Slava Zolotov
т.е. вот это: Ready = false; Task.Run(DoTask); as...

почти но да, оно последовательное

Похожие вопросы

Обсуждают сегодня

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Всем привет! Массив вводится с клавиатуры, кол-во элементов неизвестно, поэтому я указал arr db 100 dup(?) С нахождением максимума проблем нет, а вот минимум почему-то всегд...
En Vind Av Sorg
11
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
Я хочу запустить свой проект в тг. Что-то между пирамидой и майнилкой. Еще подобного ничего не было. Уникальная идея. Нужен именно не бот, а приложение. С ввод, выводом тон...
Павел А.
6
а как бы вылезти из ИО, что то типа IO -> Ether или в какую сторону смотреть ? что то туплю
Fedor
14
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Реально в одиночку написать игровой движок на Си?
ㅤ (SVO)
11
Всем привет, товарищи! Можете меня поздравить, получил "отлично" за дисциплину "языки программирования низкого уровня". Честно говоря, не очень хочу, чтобы основы асма, которы...
Ыиу
1
Карта сайта