异步和位置监听器遇到问题

时间:2018-06-24 00:29:14

标签: c# xamarin geolocation async-await object-reference

我已经在MSDN和这里进行了研究,并且尝试了许多不同的方法来执行此操作,但没有任何效果。我正在尝试为Xamarin的James Montemagno的geolocator插件启动监听器。即使使用他的确切代码,我也完全陷入困境。

我认为await.async必须完全缺少某些东西,也许一般来说只是C#中的OO编程。我是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关键字就无法使用该方法。

我也尝试过使用static关键字,但是它说它需要对象引用。但是,当我尝试创建对象引用时,它说它不返回任何内容。我尝试的每种不同方式都会出错。我只希望能够立即启动侦听器。在StartListening()中的if阻止了我为StartListening()方法提供返回类型之后,我意识到了return语句,但是我还是不希望返回类型。如果已经在侦听StartListeningAsync,我需要一种不运行它的方法,所以我需要返回。

我对异步方法非常迷惑。也许如果我只是了解如何为非静态方法做对象引用会有所帮助。但是我试过使用变量,但这是行不通的。

1 个答案:

答案 0 :(得分:1)

构造函数不能是异步的,因此在它们内部调用异步方法可能会出现问题。最简单的解决方法是从应用的OnStart()中调用它,该操作可以异步进行

protected async override void OnStart()
{
    if (Settings.LocationTracking == true)
            {
                await LocationControls.StartListening(); 
            }
}