Здравствуйте, novitk, Вы писали:
S>>Ну и чем это лучше
S>>Task.WhenAll
N>а) WhenAll тут не нужен.
Нужен. Он хочет параллельно выполнять 2 задачи. Хотя в .Net есть еще и Parallel.
N>б) Суть в другом. В jvm nет никаких async функций. Любая функция может быть запущена, как синхронно, так и ассинхронно. Решение принимает тот, кто ее вызывает. Сейчас прибежит mrTwister и скажет, что в GoLang тоже. И отчасти он будет прав, но лишь отчасти. Из за криворукости "простоты" там не поддерживается вся семантика в обеих контестах. В частности, если функция вызвана через go, то ее результат получить невозможно. Единственный способ получения результата из ассинхронного вызова это использовать всякие неявные методы (обычно каналы, ну или shared memory), но это требует переписки функций, то есть фактически не сильно отличается от .net.
Ну async/await сделан на основе Linq вернее yield в IEnumerable. Тут рядом ветка C++
http://rsdn.org/forum/cpp/9027202.flatАвтор: Videoman
Дата: 06.12 00:32
Они тоже мучаются с корутинами. В .Net же Linq компилятор генерирует класс с автоматом.
Компилятор C# действительно генерирует скрытый класс-автомат (State Machine) для LINQ-выражений (особенно для тех, что используют yield return и foreach), который хранит состояние и разбивает выполнение метода на секции, что позволяет ему «замораживать» и «возобновлять» выполнение, подобно работе async/await, с ключевыми вызовами, такими как MoveNext() для перехода к следующему элементу, создавая эффективные итераторы и асинхронные потоки.
В этом и вся прелесть .Net. Если сначала Linq тормозил, то затем его оптимизировали. Это же касается и async/await