Как я могу одновременно обрабатывать несколько задач в каждом цикле forach, isconnected устанавливается вызовом await item.GetIsConnected()
. На данный момент обновление идет медленно, поэтому я хотел бы, чтобы они обрабатывались одновременно.
До:
private async void Refresh()
{
foreach (var item in Cars.ToList<Carnet>())
{
await item.GetIsConnected();
if (item.IsConnected)
{
await item.GetCarDetailsAsync();
}
}
}
После:
private async void Refresh()
{
List<Task> listOfTasks = new List<Task>();
foreach (var item in Cars.ToList<Carnet>())
{
listOfTasks.Add(item.GetIsConnected());
if (item.IsConnected)
{
await item.GetCarDetailsAsync();
}
}
await Task.WhenAll(listOfTasks);
}
@JonasH Каждая итерация извлекает данные с защитного IP-адреса. это не очень медленно. что я имею в виду. Он извлекается с IP-адреса 1, проверяя детали соединения, затем второй IP-адрес начинается после завершения IP 1 ... и так далее, вместо этого я хотел бы, чтобы IP 1 и 2 начали обработку одновременно
Как метод item.GetIsConnected()
связан со свойством item.IsConnected
?
@TheodorZoulias item.GetIsConnected()
обновляет item.IsConnected
Поэтому, если вы вызовете IsConnected
до завершения асинхронного GetIsConnected()
, вы можете получить неверный результат. Что делает свойство IsConnected
ненадежным, я прав?
@TheodorZoulias да.
Поскольку вы не ожидаете вызова GetIsConnected()
в вашем примере ПОСЛЕ, цикл будет продолжаться, и значение не будет сравниваться с тем, что было бы после завершения вызова GetIsConnected()
, я думаю, что вы хотели бы сделать, это добавить еще один метод с типом возвращаемого значения Task
и пусть метод вызывает GetIsConnected()
и await
его внутри метода, а затем вызывает GetCarDetailsAsync()
при необходимости:
//changed to return type of Task, as async void should be avoided
//unless this is an event handler method
private async Task Refresh()
//private async void Refresh() //change to this if event handler
{
List<Task> listOfTasks = new List<Task>();
foreach (var item in Cars.ToList<Carnet>())
{
listOfTasks.Add(GetCarDetails(item));
}
await Task.WhenAll(listOfTasks).ConfigureAwait(false);
}
//method to await the call to GetIsConnect()
//and then call GetCarDetailsAsync() if necessary
private async Task GetCarDetails(Carnet c)
{
await c.GetIsConnected();
if (c.IsConnected)
{
await c.GetCarDetailsAsync();
}
}
Вы сделали какое-либо профилирование, чтобы проверить, что на самом деле работает медленно? Если это какой-то API, который вы запрашиваете, вы, вероятно, получите лучшую производительность с меньшими усилиями, если запрос позволит вам получать данные для нескольких автомобилей одновременно.