большинство событий ввода / вывода обрабатываются асинхронно c способом, и если я хочу выполнить операцию syn c, мне нужно использовать Promises или ярлык await
Я полагаю, что разница, которую вы выражаете, заключается в разнице между функциональным и императивным программированием, а не в разнице между асинхронным и синхронным программированием. Поэтому я думаю, что вы говорите, что асинхронное программирование более естественно соответствует функциональному стилю, с чем я бы согласился. JavaScript в основном функциональный, хотя он также имеет императивные и OOP аспекты. C# является более обязательным и OOP, чем функциональным, хотя с каждым годом он становится все более функциональным.
Однако и JavaScript, и C# являются синхронными по умолчанию, а не асинхронными по умолчанию. Метод должен «включить» асинхронность, используя async
/ await
. Таким образом, они очень похожи.
Я пытался читать документы Microsoft и не мог понять, как этого достичь.
Шпаргалка, если вы ' Вы знакомы с асинхронным JavaScript:
Task<T>
is Promise<T>
- Если вам нужно написать оболочку для другого API (например, конструктор
Promise<T>
с использованием resolve
/ reject
), тогда вам необходим C# тип TaskCompletionSource<T>
.
async
и await
работают практически одинаково. Task.WhenAll
равно Promise.all
, а Task.WhenAny
равно Promise.any
. Не существует встроенного эквивалента для Promise.race
. Task.FromResult
равно Promise.resolve
, а Task.FromException
равно Promise.reject
.
Так Предположим, что я хочу запустить метод Task несколько раз в асинхронном режиме c, где функции вызываются параллельно. Как я могу это сделать?
(незначительная педанти c примечание: это асинхронный параллелизм, а не параллелизм, который подразумевает потоки)
Чтобы сделать это в JS, вы взял бы итерацию, map
по методу async
(результатом чего будет итерация обещаний), а затем Promise.all
эти обещания.
Чтобы сделать то же самое в C#, вы бы возьмите свой перечислимый, Select
его по методу async
(в результате чего получается множество задач), а затем Task.WhenAll
этих задач.
var tasks = y.Select(x => MyCustomTask(x)).ToList();
await Task.WhenAll(tasks);