[英]Async operation does not stop at await command
我想在Xamarin CrossPlatform应用程序上获取我的gps坐标,但是我遇到了问题。
我有以下代码:
public MapPage()
{
SearchPosition();
map = new Map
{
IsShowingUser = true,
HeightRequest = 100,
WidthRequest = 960,
VerticalOptions = LayoutOptions.FillAndExpand
};
map.MoveToRegion(MapSpan.FromCenterAndRadius(new Position(position.Latitude, position.Longitude), Distance.FromMiles(0.3)));
...
...
}
private async void SearchPosition()
{
position = await getPosition();
}
async Task<Plugin.Geolocator.Abstractions.Position> getPosition()
{
var locator = CrossGeolocator.Current;
locator.DesiredAccuracy = 50;
Plugin.Geolocator.Abstractions.Position position = await locator.GetPositionAsync(TimeSpan.FromSeconds(5));
return position;
}
我想要的只是等待gps坐标,但是在我获得gps坐标之前,它会继续并转到“ MoveToRegien”。 我不明白为什么,有人可以帮助我吗? 谢谢!
是否有任何特殊原因需要在SearchPosition
方法中返回void
而不是Task
?
这可能是您的问题,因此请将其更改为:
async Task SearchPosition()
我实际上将其更改为返回职位:
async Task<Plugin.Geolocator.Abstractions.Position> SearchPosition() => await GetPosition();
另一个问题是,您实际上是否需要通过SearchPosition()
方法包装GetPosition()
方法,该方法除了调用第一个方法外什么都不做? 好像一团糟。
您的代码很难看,没有遵循命名约定,一半的代码看起来像Java,另一半看起来像C#。 请,当您编写代码时,请尊重语言和您自己,熟悉命名约定并遵循它们。
编辑:
我想我现在看到了您的真正问题。 您试图在构造函数中获得一个位置,因此您没有等待异步SearchPosition()
方法。
如果您的MainPage
实际上是从ContentPage
派生的,我建议将与GPS相关的逻辑移至OnAppearing
方法。 这是一个例子:
public class MainPage : ContentPage
{
...
public MainPage()
{
map = new Map
{
IsShowingUser = true,
HeightRequest = 100,
WidthRequest = 960,
VerticalOptions = LayoutOptions.FillAndExpand
};
}
protected async override void OnAppearing()
{
position = await GetPosition();
map.MoveToRegion(MapSpan.FromCenterAndRadius(new Position(position.Latitude, position.Longitude), Distance.FromMiles(0.3)));
}
async Task<Plugin.Geolocator.Abstractions.Position> GetPosition()
{
var locator = CrossGeolocator.Current;
locator.DesiredAccuracy = 50;
Plugin.Geolocator.Abstractions.Position position = await locator.GetPositionAsync(TimeSpan.FromSeconds(5));
return position;
}
}
您误解了“等待”的含义(对于许多开发人员来说似乎都是这种情况)。 使用“ await”会使编译器返回到该异步方法的调用者(在您的情况下为MapPage()),并签署其余工作,在该方法中(您正在等待的内容)以所谓的“延续”。 一旦完成,异步方法将在中断处继续执行。 因此,您所抱怨的最终正是系统的意图。 :-)
如果您绝对不希望系统继续运行,则可以使SearchPosition()返回一个Task,然后在其上调用.Wait()(请参阅msdn页面 )。
如果我理解正确的话,您可能还想简单地摆脱异步模式并同步调用SearchPosition()(“我想要的只是等待gps坐标,但它仍在继续……”)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.