Возникли проблемы с Async и Location Listener - PullRequest
0 голосов
/ 24 июня 2018

Я посмотрел через MSDN и здесь, и я попробовал кучу разных способов сделать это, и ни один из них не работает. Я пытаюсь запустить слушатель плагина геолокации Джеймса Монтемано для Xamarin. Даже используя его точный код, я полностью застрял.

Я думаю, что должно быть что-то, чего я просто упускаю из await.async и, возможно, просто из-за ОО-программирования на C # в целом. Я новичок в Xamarin и C #, поэтому я немного борюсь. У меня есть класс с именем LocationControls.cs, который выглядит так

using EIOBoardMobile.Model;

namespace EIOBoardMobile.CustomControls
{

    public static class LocationControls
    {
        public static async Task StartListening()
        {

            if (CrossGeolocator.Current.IsListening)
                return;


            await CrossGeolocator.Current.StartListeningAsync(TimeSpan.FromMinutes(5), 10, true);

            CrossGeolocator.Current.PositionChanged += PositionChanged;
            CrossGeolocator.Current.PositionError += PositionError;

        }

        private static void PositionChanged(object sender, PositionEventArgs e)
        {
            GPSLocationCurrent.SetLatLong();
        }

        private static void PositionError(object sender, PositionErrorEventArgs e)
        {
            Debug.WriteLine(e.Error);
            //Handle event here for errors
        }

        private static async Task StopListening()
        {
            if (!CrossGeolocator.Current.IsListening)
                return;

            await CrossGeolocator.Current.StopListeningAsync();

            CrossGeolocator.Current.PositionChanged -= PositionChanged;
            CrossGeolocator.Current.PositionError -= PositionError;
        }
    }
}

Я хочу запустить слушатель сразу, когда откроется приложение. поэтому мой App.xaml.cs выглядит следующим образом.

    public partial class App : Application
    {

    public App()
        {
            InitializeComponent();
            MainPage = new NavigationPage(new MainPage());
            if (Settings.LocationTracking == true)
            {
                await LocationControls.StartListening(); 
                //this is where I'm getting the error
            }
        }

Ошибка говорит о том, что я могу использовать await только с асинхронным методом. Но затем, если я пытаюсь не использовать await, он говорит, что я не могу использовать метод без ключевого слова await.

Я пробовал это также без статических ключевых слов, но затем он говорит, что ему нужна ссылка на объект. Но потом, когда я пытаюсь создать ссылку на объект, он говорит, что ничего не возвращает. Каждый раз, когда я пробую это, я получаю ошибку. Я просто хочу иметь возможность немедленно запустить слушателя. Я понимаю, что оператор return после if в StartListening () не позволяет мне дать методу StartListening () тип возвращаемого значения, но я все равно не хочу возвращаемый тип. Мне нужен способ не запускать StartListeningAsync, если он уже прослушивается, поэтому мне нужно это возвращение.

Я так запутался в асинхронных методах. Возможно, если бы я только понял, как сделать ссылку на объект для нестатических методов, которые могли бы помочь. Но я пытался использовать переменные, и это не работает.

1 Ответ

0 голосов
/ 24 июня 2018

Конструкторы не могут быть асинхронными, поэтому вызов асинхронных методов внутри них может быть проблематичным.Самый простой обходной путь - вызвать его из приложения OnStart (), которое может быть асинхронным

protected async override void OnStart()
{
    if (Settings.LocationTracking == true)
            {
                await LocationControls.StartListening(); 
            }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...