Есть такой кусок кода. Как можно данный код сделать асинхронным?
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;
}
Здравствуйте, 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);
}
}
Здравствуйте, 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). Но только какой в этом
смысл?