Xamarin Asyn c Конструктор - PullRequest
1 голос
/ 26 мая 2020

Для моего приложения мне нужно получить некоторые данные асинхронно и выполнить некоторую инициализацию для каждой страницы. К сожалению, конструктор не позволяет мне выполнять асинхронные вызовы. Я следил за этой статьей и поместил весь свой код в метод OnAppearing. Однако с тех пор я столкнулся с несколькими проблемами, поскольку каждая платформа обрабатывает событие немного по-своему. Например, у меня есть страницы, на которых вы можете делать снимки, на iOS OnAppearing вызывается снова каждый раз после закрытия камеры, а Android - нет. Это не кажется надежным методом для моих нужд, который также описан здесь :

Вызовы переопределений OnDisappearing и OnAppearing не могут рассматриваться как гарантированные индикации навигации по страницам. Например, на iOS переопределение OnDisappearing вызывается на активной странице при завершении работы приложения.

Я ищу метод / способ, с помощью которого я могу выполнить свою собственную инициализацию. Для этого идеально подошел бы конструктор, но я не могу там ничего выполнять асинхронно. Пожалуйста, не предлагайте мне обходные пути, я ищу решение, которое является «рекомендуемым» способом, или, возможно, кто-то с большим опытом может сказать мне, что они делают. (Я также не хочу использовать .Wait () или .Result, так как это заблокирует мое приложение)

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

Это может быть слишком просто, но вы МОЖЕТЕ запускать асинхронные задачи в конструкторе. Просто заверните его в анонимную задачу.

public MyConstructor() {
    Task.Run(async () => {
        <Your code>
    }
}

Будьте осторожны при этом, так как вы можете столкнуться с проблемами конфликта ресурсов, если случайно откроете страницу дважды.

Еще одна вещь, которую я люблю do - это использование флага _isInit, который указывает на использование в первый раз, а затем никогда снова.

0 голосов
/ 27 мая 2020

Вы можете использовать отличный NotifyTaskCompletion класс Стивена Клири.

Вы можете узнать больше о том, как он работает и что делать / не делать в этих случаях, в отличном Asyn * от Microsoft 1017 * Программирование: шаблоны для асинхронных приложений MVVM: привязка данных . Основные моменты этих тем:

Давайте рассмотрим основной метод NotifyTaskCompletion.WatchTaskAsyn c. Этот метод принимает задачу, представляющую асинхронную операцию, и (асинхронно) ожидает ее завершения. Обратите внимание, что ожидание не использует ConfigureAwait (false); Я хочу вернуться в контекст пользовательского интерфейса, прежде чем вызывать уведомления PropertyChanged. Этот метод нарушает общие правила кодирования здесь: он имеет пустое общее предложение catch. Но в данном случае я именно этого и хочу. Я не хочу передавать исключения непосредственно в основной цикл пользовательского интерфейса; Я хочу фиксировать любые исключения и устанавливать свойства, чтобы обработка ошибок выполнялась с помощью привязки данных. Когда задача завершается, тип генерирует уведомления PropertyChanged для всех подходящих свойств. значение для некоторого привязываемого свойства, но, конечно, вы можете без какого-либо возвращаемого значения (для простой загрузки данных).

...