Код: Выделить всё
private async Task SelectNewAddress(AddressElement elem, bool withFillParam)
{
foreach (var fieldSource in elem.DicFields.Values)
{
if (fieldSource.Id > 0)
address.SelectAddressField(fieldSource);
}
var lowLevelElementKey = address.DicFields.Where(p => p.Value != null && p.Value.Id > 0).Max(p => p.Key);
List listTasks = new List();
if (withFillParam)
{
var t = FillParams();
listTasks.Add(t);
}
foreach (var kkey in address.DicFields.Keys)
{
var field = address.DicFields[kkey];
if (field.Id > 0 && field.IdParent > 0)
{
var t1 = FillDataSourceForElem(field);
listTasks.Add(t1);
if (kkey == lowLevelElementKey)
{
var t2 = Task.Run(async () =>
{
if (field.Level >= 1 && field.Level { StateHasChanged(); });
//_ = Task.Run(async () =>
// {
// await Task.WhenAll(listTasks.ToArray());
// await InvokeAsync(() => { StateHasChanged(); });
// });
}
Если я удалю дополнительную задачу и WhenAll и попробую дождаться каждой функции (FillDataSourceForElem, FillAllChilds и т. д.), я застряну в ожидании _httpClient.GetAsync(), но каждый раз я застреваю на разных функциях. Первый раз в FillDataSourceForElem, следующий раз в FillAllChilds и т. д.
Теперь я понятия не имею, почему это происходит.
Похоже на тупую блокировку...
В F12 я вижу, что браузер сделал запрос, но не получил ответа (статус ожидания). Затем WhenAll завис, потому что задачи не могут быть выполнены, но почему это происходит только 1 раз, почему это работает в MAUI и почему GetAsync зависает (если я делаю точку останова на стороне сервера в контроллере, я вижу, что метод контроллера возвращает результат).
Если я запускаю и забываю (как в комментарии), я вижу, что все запросы выполняются быстро, получаю результат от сервера и жду, когда WhenAll() в _ = Task.Run завершится нормально.
если кто-нибудь знает причину, буду признателен.
Я использую httpClient, что инициализировать вот так
Код: Выделить всё
HttpClient _client;
protected override async System.Threading.Tasks.Task OnInitializedAsync()
{
_client = ClientFactory.CreateClient("clientName");
}
Полный стек вызовов:
В компоненте blazor
Код: Выделить всё
protected override async Task OnParametersSetAsync()
{
await Initialise();
}
Код: Выделить всё
private async Task Initialise()
{
var result = await GetAddressFromDB();
}
Код: Выделить всё
private async Task GetAddressFromDB()
{
try
{
var elem = await _client.GetFromJsonAsync($"url?idForm={IdForm}");
if (elem is null)
return false;
if (elem.Region is null)
return false;
if (elem.Region.Id = 1 && elem.Level p.Level == elem.Level).ToList();
}
else if (elem.Level == 9)
{
fields = await GetSteads(elem.IdParent);
}
else if (elem.Level == 10)
{
var rez = await GetHouses(elem.IdParent);
fields = rez.Select(x => { AddressField b = x; return b; }).ToList();
}
else if (elem.Level == 11)
{
fields = await GetAppartments(elem.IdParent);
}
else if (elem.Level == 12)
{
fields = await GetRooms(elem.IdParent);
}
else if (elem.Level == 17)
{
fields = await GetCarPlaces(elem.IdParent);
}
foreach (var fieldChild in fields)
{
address.AddAddreesFieldInSameLevel(fieldChild);
}
}
private async Task SearchChildsElements(long idParent)
{
List result = null;
try
{
result = await _client.GetFromJsonAsync($"url?id={idParent}&useMun={_isMunHierarchy}");
}
catch (Exception ex)
{
//log here
}
if (result is null)
return new List();
return result;
}
Не используйте несколько задач в WASM. После отключения дополнительных задач зависание прекратилось.
Подробнее здесь: https://stackoverflow.com/questions/783 ... lazor-wasm
Мобильная версия