我已经在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,我需要一种不运行它的方法,所以我需要返回。
我对异步方法非常迷惑。也许如果我只是了解如何为非静态方法做对象引用会有所帮助。但是我试过使用变量,但这是行不通的。
答案 0 :(得分:1)
构造函数不能是异步的,因此在它们内部调用异步方法可能会出现问题。最简单的解决方法是从应用的OnStart()中调用它,该操作可以异步进行
protected async override void OnStart()
{
if (Settings.LocationTracking == true)
{
await LocationControls.StartListening();
}
}