N>Конечно ожидается что точка вызова уже async. Собственно есть встроенная обертка Task.Run
Я знаю, что есть в C#, и знаю, как сложно дебажить все эти "встроенные обертки". Именно об этом я и пишу — нет стройности и легкости. А так-то, конечно, все языки более-менее эквивалентны по возможностям.
N>"красиво и элегантно" это религия, а к "писанины куда меньше" в соседний топик. Там пока у C# короче.
В "соседнем топике" я написал через "длинный вариант", чтобы было понятно, как именно оно работает. Причем call stack'и там будут очень понятные в случае с Erlang, и — ууух, поди разберись! — в случае с C#.
Что, конечно, не умаляет достоинств команды .NET и конкретно C#. Правильной дорогой идут, добавляя лучшее из других языков, и делая очень работоспособные высокоуровневые обертки. Именно эти обертки, от Task.Run до WhenAny, и есть ответ на вопрос из сабжа. Беда с ними лишь в том, что иногда это таки нужно дебажить...