Следующий код работает отлично. Он показывает счетчик в пользовательском интерфейсе, запускает задачу, используя поток из пула потоков, и выполняет тяжелую операцию, после завершения которой логика, позволяющая скрыть счетчик, выполняется в основном потоке, как и предполагалось.
public void LoadCustomers()
{
// Update UI to show spinner
this.LoadingCustomers = true;
Task.Run(async () =>
{
var customers = await this.custService.GetCustomers();
// code truncated for clarity
Device.BeginInvokeOnMainThread(() =>
{
// Update UI to hide spinner
this.LoadingCustomers = false;
});
});
}
мой вопрос; Есть ли лучший способ написать эту логику, используя параметры ContinueWith / ConfigureAwait? Использование этих параметров, кажется, блокирует поток пользовательского интерфейса. В приведенном ниже примере, не должен ли поток пользовательского интерфейса продолжать выполнение логики пользовательского интерфейса (анимация вращающегося / пользовательского ввода) и затем возвращаться для завершения логики внутри ContinueWith?
public void LoadCustomers()
{
// Update UI to show spinner
this.LoadingCustomers = true;
this.custService.GetCustomers().ContinueWith((t) =>
{
var customers = t.Result;
// code truncated for clarity
// Update UI to hide spinner
this.LoadingCustomers = false;
});
}
Как и просили в комментариях, вот код для GetCustomers. dbContext - это EntityFrameworkCore.
public async Task<List<CustomerModel>> GetCustomers()
{
return await this.dbContext.Customers.ToListAsync();
}
UPDATE
Однако ответ от FCin правильный; Причина этого, по-видимому, связана с EFCore и ToListAsync, он не работает асинхронно.