Ответ 1
Не просто ли очистить поток, как только вызывается метод асинхронного вызова.
Весь смысл "асинхронных" методов заключается в том, чтобы избежать появления нового потока.
Вы запутываете асинхронность с concurrency. Асинхронные методы не должны выполняться в другом потоке, чтобы быть асинхронными. Точка асинхронных методов заключается в том, что они позволяют разбить работу на маленькие кусочки, которые должны выполняться в определенном порядке, но необязательно, без выполнения другой работы над одним и тем же потоком.
Подумайте о потоке, как о работнике, которого вы можете нанять. Подумайте об асинхронном методе как список дел с паузами между элементами. Если ваш список дел говорит: "Идите в магазин, покупайте молоко и яйца, отправляйтесь домой, делайте омлет", тогда преимущество асинхронного действия заключается в том, что когда кто-то называет ваш сотовый телефон между шагом "покупать яйца" и "идет домой" и говорит: "Можете ли вы зайти в аптеку по дороге домой и забрать мой рецепт?" вы можете принять вызов и запланировать работу, прежде чем делать омлет. При использовании неасинхронных методов телефон продолжает звонить до тех пор, пока омлет не будет выполнен, а затем вы вызовете вызов. Пользовательский интерфейс блокируется, пока вы не закончите то, что делаете.
Ваша концепция заключается в том, что для того, чтобы поддерживать поток пользовательского интерфейса, в тот момент, когда вы получаете список дел, вы отправляете нанимать какого-нибудь парня, чтобы бежать в магазин для вас, чтобы вы могли принять вызов о аптека. Это дорого и не нужно. Все может оставаться в одном потоке с помощью async, потому что у длительной задачи есть встроенные точки, где пользовательский интерфейс прервет и заплатит больше работы.