@strizhechenko «просто создавать таски» из 4 пункта нельзя.
За ними может прийти GC и они испарятся.
Что у тебя и происходит, вроде как.

Вариант с gather наиболее логичный и он должен работать.
Проверь параметры gather’а, он умеет обрабатывать исключения.

Если совсем правильно делать, конечно, то надо в каждой таске ловить и обрабатывать cancelerror, ну и кэнселить их.

Плюс у тебя await’ы в некоторых местах в синхронных функах, это точно то?)