Можно ли сделать код без предупреждений ?
От: e.thrash  
Дата: 11.01.24 08:59
Оценка:
Есть такой вот код

   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'" подсвечивая выделенное место
Можно ли без прямого цикла убрать предупреждение?
Re: Можно ли сделать код без предупреждений ?
От: pugv Россия  
Дата: 11.01.24 10:20
Оценка: +1 -1
Это предупреждение примерно о том же, о чём рекомендация не использовать 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;
  });
});
Re: Можно ли сделать код без предупреждений ?
От: sergii.p  
Дата: 11.01.24 12:37
Оценка: 9 (1)
Здравствуйте, e.thrash, Вы писали:

ET>Можно ли без прямого цикла убрать предупреждение?


вроде так должно работать

Task.WhenAll(Ids.Select((p) => GetDataAsync(p, ct)));
Re[2]: Можно ли сделать код без предупреждений ?
От: pugv Россия  
Дата: 11.01.24 12:45
Оценка: 9 (1) +1
Здравствуйте, sergii.p, Вы писали:

SP>вроде так должно работать


SP>
SP>Task.WhenAll(Ids.Select((p) => GetDataAsync(p, ct)));
SP>


А это не эквивалент, исходный код ничего не дожидается.
Re[3]: Можно ли сделать код без предупреждений ?
От: sergii.p  
Дата: 11.01.24 13:10
Оценка: +1
Здравствуйте, pugv, Вы писали:

P>А это не эквивалент, исходный код ничего не дожидается.


и этот ничего не дожидается. Не вызывайте Wait и ничего ждать не будете.
Re: Можно ли сделать код без предупреждений ?
От: RushDevion Россия  
Дата: 11.01.24 14:40
Оценка: -1
ET>Можно ли без прямого цикла убрать предупреждение?

Вставляй в начало файла
#pragmа warning disable XXX // Тут подставь код своего предупреждения

И будет тебе щастье вообще без изменений в коде
Re: Можно ли сделать код без предупреждений ?
От: Разраб  
Дата: 12.01.24 03:17
Оценка: +1
Разрешаю. Делай.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Можно ли сделать код без предупреждений ?
От: Разраб  
Дата: 12.01.24 07:27
Оценка:
Здравствуйте, e.thrash, Вы писали:

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.

☭ ✊ В мире нет ничего, кроме движущейся материи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.