На самом деле это не примерно async void
.
Обычно вы хотите запустить асинхронную операцию и позволить вашему установщику свойств вернуться.Пример фрагмента:
private string carManufacturerFilter;
public string СarManufacturerFilter
{
get { return carManufacturerFilter; }
set
{
if (carManufacturerFilter != value)
{
carManufacturerFilter = value;
OnPropertyChanged();
// fire async operation and forget about it here;
// you don't need it to complete right now;
var _ = RefreshCarsListAsync();
}
}
}
private async Task RefreshCarsListAsync()
{
// call some data service
var cars = await someDataService.GetCarsAsync(carManufacturerFilter)
.ConfigureAwait(false);
// ...
}
Обратите внимание, что здесь есть много вещей, которые можно добавить:
- , так как это подход «забыл и забыл», вам нужно заблокировать ввод пользователяпока операция не запущена.Другими словами, должен быть какой-то индикатор занятости:
- вы можете отложить запуск асинхронной операции.Это обычно применимо, когда есть строковые свойства.Вы не хотите запускать асинхронную операцию после каждого введенного пользователем символа.Вместо этого желательно подождать, пока пользователь завершит ввод;
- может быть несколько свойств, которые запускают одну и ту же асинхронную операцию (представьте сложный фильтр данных).Некоторые из них должны запускать операцию немедленно (например, флажок), некоторые требуют задержки перед запуском;
- вам нужно обрабатывать исключения внутри асинхронного метода и как-то отображать ошибки.
PS IНастоятельно рекомендуем взглянуть на Реактивный интерфейс .