@strizhechenko «просто создавать таски» из 4 пункта нельзя.
За ними может прийти GC и они испарятся.
Что у тебя и происходит, вроде как.
Вариант с gather наиболее логичный и он должен работать.
Проверь параметры gather’а, он умеет обрабатывать исключения.
Если совсем правильно делать, конечно, то надо в каждой таске ловить и обрабатывать cancelerror, ну и кэнселить их.
Плюс у тебя await’ы в некоторых местах в синхронных функах, это точно то?)