Сделать метод асинхронным
От: snaphold  
Дата: 27.04.23 13:48
Оценка:
Есть такой кусок кода. Как можно данный код сделать асинхронным?

void Process(IEnumberable<Car> cars)
{

   var converted = Convert(cars);
}

IEnumerable<CarDto> Comvert(IEnumberable<Car> cars)
{
   List<CarDto> converted = new List<CarDto>();
   var carType = cars.First().Type;

   if (carType = Track)
   {
    converted.Add(new CarDto() {...});
   }
   else if (carType = Vehicle)
   {
    converted.Add(new CarDto() {...});
   }

   return converted;
}
Re: Сделать метод асинхронным
От: Sinclair Россия https://github.com/evilguest/
Дата: 27.04.23 14:05
Оценка: 4 (1) +1
Здравствуйте, snaphold, Вы писали:

S>Есть такой кусок кода. Как можно данный код сделать асинхронным?


S>
S>void Process(IEnumberable<Car> cars)
S>{

S>   var converted = Convert(cars);
S>}

S>IEnumerable<CarDto> Convert(IEnumberable<Car> cars)
S>{
S>   List<CarDto> converted = new List<CarDto>();
S>   var carType = cars.First().Type;

S>   if (carType = Track)
S>   {
S>    converted.Add(new CarDto() {...});
S>   }
S>   else if (carType = Vehicle)
S>   {
S>    converted.Add(new CarDto() {...});
S>   }

S>   return converted;
S>}
S>

0. В этом коде масса опечаток, из-за которых он не заработает даже в синхронном варианте. Вы, наверное, имели в виду какой-то другой код, вроде такого:
public IEnumerable<CarDto> Convert(IEnumberable<Car> cars)
{
   switch(cars.First().Type)
   {
       case Track: yield return new CarDto() {...};
       case Vehicle: yield return new CarDto() {...};
   }
}


1. Этот код не нужно делать асинхронным. Асинхронность лучше всего работает с ожиданием, чуть хуже — с вычислительно-интенсивными задачами. Здесь нет ни того, ни другого.
2. В этом коде возвращается либо пустой список, либо список из одного элемента. Поэтому асинхронно перебирать результирующий енумерабл резону нет. Достаточно сделать так:
ValueTask<IEnumerable<CarDto>> Convert(IEnumberable<Car> cars)
{
   List<CarDto> converted = new List<CarDto>();
   var carType = cars.First().Type;

   if (carType == Track)
   {
    converted.Add(new CarDto() {...});
   }
   else if (carType == Vehicle)
   {
    converted.Add(new CarDto() {...});
   }

   return ValueTask.FromResult(converted);
}

3. Ежели, паче чаяния, у вас всё же возникнет код, в котором нужно будет конвертировать экземпляры Car в экземпляры CarDto каким-то дорогостоящим образом (например, при помощи вызовов в какой-то удалённый сервис), то пишется он примерно как-то так:

public async IAsyncEnumerable<CarDto> Convert(IEnumberable<Car> cars)
{
   foreach(var car in cars)
   {
      var t = car.Type switch
      {
         Track => await ...,
         Vehicle => await ...,
         _ => ...
      }
      yield return new CarDto(t);
   }
}
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Сделать метод асинхронным
От: Sharov Россия  
Дата: 28.04.23 10:40
Оценка: +2
Здравствуйте, snaphold, Вы писали:

S>Есть такой кусок кода. Как можно данный код сделать асинхронным?


S>
S>void Process(IEnumberable<Car> cars)
S>{

S>   var converted = Convert(cars);
S>}

S>IEnumerable<CarDto> Comvert(IEnumberable<Car> cars)
S>{
S>   List<CarDto> converted = new List<CarDto>();
S>   var carType = cars.First().Type;

S>   if (carType = Track)
S>   {
S>    converted.Add(new CarDto() {...});
S>   }
S>   else if (carType = Vehicle)
S>   {
S>    converted.Add(new CarDto() {...});
S>   }

S>   return converted;
S>}
S>



Можно синхронный код сделать асинхронным с помощью Task.FromResult, т.е. Task.FromResult(converted). Но только какой в этом
смысл?
Кодом людям нужно помогать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.