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

25 просмотров

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

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

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

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта