C# 异步操作不会在等待命令时停止
我想在Xamarin跨平台应用程序上获取gps坐标,但我遇到了一个问题 我有以下代码:C# 异步操作不会在等待命令时停止,c#,android,asynchronous,xamarin,gps,C#,Android,Asynchronous,Xamarin,Gps,我想在Xamarin跨平台应用程序上获取gps坐标,但我遇到了一个问题 我有以下代码: public MapPage() { SearchPosition(); map = new Map { IsShowingUser = true, HeightRequest = 100, WidthRequest = 960, VerticalOption
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;
}
publicmappage()
{
SearchPosition();
地图=新地图
{
IsShowingUser=true,
HeightRequest=100,
宽度请求=960,
VerticalOptions=LayoutOptions.FillAndExpand
};
地图。移动到区域(地图跨度。从中心到半径(新位置(位置。纬度,位置。经度),距离。从英里(0.3));
...
...
}
私有异步void SearchPosition()
{
位置=等待getPosition();
}
异步任务getPosition()
{
var定位器=CrossGeolocator.Current;
locator.DesiredAccuracy=50;
Plugin.geologitor.Abstractions.Position Position=wait locator.GetPositionAsync(TimeSpan.FromSeconds(5));
返回位置;
}
我只想等待gps坐标,但它会继续,并在我获得gps坐标之前转到“MoveToRegien”。我不明白为什么,有人能帮我吗?谢谢 在
SearchPosition
方法中返回void
而不是Task
有什么特殊原因吗
这可能是您的问题,请将其更改为:
async Task SearchPosition()
我会将其更改为实际返回一个位置:
async Task<Plugin.Geolocator.Abstractions.Position> SearchPosition() => await GetPosition();
您误解了“等待”的含义(对于许多开发人员来说似乎是这样)。 使用“await”会导致编译器返回到该异步方法的调用方(在您的例子中是MapPage()),并注册在该方法中完成的其余工作(您正在等待的)作为所谓的“continuation”。一旦完成,异步方法就会在停止的地方继续执行。 因此,您所抱怨的最终正是系统要做的事情。:-) 如果您确实不希望系统继续运行,可以让SearchPosition()返回一个任务,然后调用.Wait()(请参阅)
如果我理解正确,您可能还想简单地摆脱异步模式并同步调用SearchPosition()(“我只想等待gps坐标,但它会继续…”)。异步空白就像一场火灾,然后忘记。像这样,你不是在等待SearchPosition方法完成。我怎么能等它呢?可能是@mnemonic的重复我看到了帖子,但它并不能解决问题。有什么想法吗?@Imrik如果你想/需要一些async/await用法的例子,你也可以看看我的答案:谢谢你的建议。它不起作用,它在位置变量处仍然有空值。更新了我的答案。我更新了代码,并在OnAppearing方法上设置了断点,它不会在任何代码行停止。它在位置变量处仍然有空值。还有什么想法吗?非常感谢!:)哦,我修好了,是我的错。但是我知道我有这个异常:未处理的异常:Java.Lang.ClassNotFoundException:在路径:DexPathList[[zip file”/data/app/com.companyname.PruebaMapas-1/base.apk]的NativeLibrary目录中未找到类“MD5725F317A80041E1A60080AF127573BD.GeolocationSingleListener”=[/data/app/com.companyname.PruebaMapas-1/lib/x86,/system/fake libs,/data/app/com.companyname.PruebaMapas-1/base.apk!/lib/x86,/system/lib,/vendor/lib]]我在谷歌上搜索,但它什么也没找到。有什么想法吗?这是另一个问题,如果你在stackoverflow或WEB上的现有线程中找不到答案,应该单独询问。
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;
}
}