Я подобные нужды без async/await покрывал частично через экстеншн Operation (чтобы они ждали выполнения также и асинхронного кода)
Вернее через дочерний класс, ошибся. Что-то вроде
ControllableOperation: Operation
Суть в том, что останавливать ее нужно вручную, например изнутри из асинхронного кода после его завершения.