}
далее есть задача
Ready = false;
Task.Run(DoTask);
async Task DoTask()
{
while (!Ready) ;
//..do the task
}
и далее извне в какой-то момент Ready = true;
в релизной конфигурации DoTask никогда не завершается почему-то, раньше такой проблемы не было
помогло только такое решение while (!Ready) await Task.Delay(500);
вопрос, почему так может быть?
ты ждешь выполнения таска?
тогда await Task.Run()
так не могу, надо запустить и забыть
а как ты понимаешь, что таск не завершается?
так, что не выполняются действия после комментария //..do the task
кароче, у тебя, наверно, компиллятор выкидывает while() без delay, и таск завершается сразу после запуска
у меня, кстати, runtime monodroid
Ilspy и смотри что там, а вообще, это решение говно, делай на ивентах или хотя бы TaskCompletionSource
глянул ilspy, логика на месте
Плохой код.
Используй CancellationToken, и проблемы не будет. А код плох потому, что он не следует модели памяти. И поэтому в многопоточном сценарии тут может быть буквально что угодно.
что значит не следует модели памяти?
А ты почитай про неё. У тебя у одной и той же переменной в разных потоках чтение и запись без барьеров. Это вообще фуфуфу такое делать.
так а что конкретно-то читать? тема проблемы как называется?
проблема создала компиляция с LLVM: https://docs.microsoft.com/en-us/xamarin/android/deploy-test/release-prep/?tabs=windows#llvm-optimizing-compiler ещё беглое гугление показало, что у многих вообще приложения падали из-за этого, у меня ещё простой случай
почитал, мой частный случай не затрагивает проблему модели памяти, так как момент, когда запускается Task, у меня переменная всегда false уже это, конечно, не отменяет факта того, что надо переписать
Очень классно, когда люди думают о проблеме, ты молодец. Но тогда непонятно, чо оно не работает :)
т.е. вот это: Ready = false; Task.Run(DoTask); async Task DoTask() { while (!Ready) ; //..do the task } в одном методе?
почти но да, оно последовательное
Обсуждают сегодня