Теперь я знаю, что свойства не поддерживают async/wait по уважительным причинам. Но иногда вам нужно запустить дополнительную обработку фона из средства настройки свойств - хорошим примером является привязка данных в сценарии MVVM.
В моем случае у меня есть свойство, связанное с SelectedItem ListView. Разумеется, я сразу же установил новое значение в поле поддержки и выполнил основную работу свойства. Но изменение выбранного элемента в пользовательском интерфейсе также должно инициировать вызов службы REST для получения новых данных на основе выбранного элемента.
Поэтому мне нужно вызвать метод async. Я не могу дождаться этого, очевидно, но я также не хочу запускать и забывать вызов, поскольку я мог бы пропустить исключения во время обработки асинхронизации.
Теперь мой прием следующий:
private Feed selectedFeed;
public Feed SelectedFeed
{
get
{
return this.selectedFeed;
}
set
{
if (this.selectedFeed != value)
{
this.selectedFeed = value;
RaisePropertyChanged();
Task task = GetFeedArticles(value.Id);
task.ContinueWith(t =>
{
if (t.Status != TaskStatus.RanToCompletion)
{
MessengerInstance.Send<string>("Error description", "DisplayErrorNotification");
}
});
}
}
}
Хорошо, так что помимо того, что я мог бы переместить обработку из сеттера синхронному методу, это правильный способ справиться с таким сценарием? Есть ли лучшее, менее захламленное решение, которое я не вижу?
Было бы очень интересно увидеть некоторые другие проблемы, связанные с этой проблемой. Мне немного любопытно, что мне не удалось найти других обсуждений по этой конкретной теме, поскольку мне кажется очень распространенным я в приложениях MVVM, которые сильно используют привязку данных.