Array.ForEach(Ids.ToArray(), async (p) =>
{
var result = await GetDataAsync(p, ct);
});
...
Task<Guid?> async GetDataAsync(..)
{
}
Райдер пишет "Avoid using 'async' lambda when delegate type returns 'void'" подсвечивая выделенное место
Можно ли без прямого цикла убрать предупреждение?
Это предупреждение примерно о том же, о чём рекомендация не использовать async void методы.
Что будет, если эта async лямбда выкинет исключение? Кто его поймает?
Array.ForEach(Ids.ToArray(), async (p) =>
{
var result = await GetDataAsync(p, ct);
});
А в чём вообще смысл этого кода? Array.Foreach под капотом всего лишь вызывает переданный Action в синхронном цикле. Зачем он async? Если цель — для каждого элемента запустить fire-and-forget таску, то её и запускай внутри синхронного Action.
Array.ForEach(Ids.ToArray(), p =>
{
Task.Run(() =>
{
var result = GetDataAsync(p, ct).Result;
});
});
let makeTask (x:int) = task { do! Async.Sleep x };;
val makeTask: x: int -> Task<unit>
[1;2;3;4;5] |> List.iter(fun x -> makeTask x |> ignore);;
val it: unit = ()
F# дает вам простоту и лаконичность, как у Python,
с корректностью, надежностью и производительностью,
превосходящими C# или Java.