Задать вопрос

C# Portable Class Library async property, как бы сделать попрямее код?

Приветсвтую.
Хочу создать класс с асинхронными геттерами пропертей. Вроде бы даже удалось и работает. Есть только сомнения по поводу красоты кода, но знаний как сделать покрасивее не хватает..
private double _d;
        public double D
        {
            get
            {
                System.Threading.SynchronizationContext.Current.Post((s) =>
                {
                    Action a = async () => { D = await getD(); };
                    a();
                }, this);
                return _d;
            }
            set
            {
                _d = value;
                NotifyPropertyChanged("D");
            }
        }

        private async Task<double> getD()
        {
            HttpClient hc = new HttpClient();
            HttpResponseMessage resp = await hc.GetAsync("http://habr.ru");
            string pageContent = await resp.Content.ReadAsStringAsync();
            return pageContent.Length;
        }

Можно ли тут как нибудь вызвать Action без создания оного? сразу бы в одной строчке вызвать, чтоб посолиднее смотрелось ;)

И второй вопрос, тупенький: как можно "считать" эту проперти без присваивания к чему нибудь.
То есть просто
o.D;
вместо
double a = o.D;
Так то оно считывается при первом биндинге к гую, вот если захочу зарефрешить, то не знаю как покрасивше сделать..
Ну либо вообще отговорите меня от этой безумной идеи и предложите варианты поинтереснее :)
  • Вопрос задан
  • 2492 просмотра
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@i_light
Backend, XAML, crossplatform
Не очень понимаю, зачем вам асинхронный геттер.

Сделайте в модели асинхронный метод, который получает значение и заносит его в поле, связанное с UI. Метод можно вызывать в конструкторе, или по таймеру, или через команду - как нужно.

Если не нравится, что пока идёт загрузка, в UI показывается значение по умолчанию - тут уже варианты, от банального FallbackValue при связывании до конвертеров и кастомных полей (как-то для такой цели я сделал поле модели типа string, при асинхронной загрузке заносил туда значение типа "loading...", а после успешной загрузки клал туда отформатированное в string значение).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы