Kotlin: lateinit to val или, альтернативно, var, который можно установить один раз

Это называется «тупик», очень распространенная проблема с потоками. BGW не может перестать быть занятым до запуска RunWorkerCompleted. Это событие работает в основном потоке вашего приложения, оно может работать только тогда, когда ваш основной поток не занят чем-то другим. Он должен быть бездействующим, работающим внутри цикла диспетчера.

Но ваш основной поток не простаивает, он застревает внутри цикла while (), ожидая, что IsBusy вернет false. Таким образом, событие никогда не будет выполняться с тех пор, как основной поток занят, ожидая завершения BGW, BGW не может завершить работу, потому что основной поток никогда не простаивает. «Deadly embrace», aka deadlock.

Вам придется делать это по-другому, вы не можете ждать. Скажем, создав еще один экземпляр BGW. Или просто не позволяйте этому коду работать до тех пор, пока не произойдет событие RWC. Или установив флаг, проверенный обработчиком события RunWorkerCompleted, который может снова запустить BGW.

17
задан Banana 25 January 2018 в 18:39
поделиться