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 ответов

29 просмотров

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

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...

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта