c# - 异步操作不会在await命令处停止

标签 c# android asynchronous xamarin gps

我想在 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#。请在编写代码时尊重语言和自己,熟悉 naming conventions并关注他们。

编辑:
我想我现在看到了你真正的问题。您正在尝试在构造函数中获取位置,因此您不会等待异步 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;
    }
}

关于c# - 异步操作不会在await命令处停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48111472/

相关文章:

android - 如何解析作为多维数组表示形式的字符串

java - 在 ArrayAdapter 中设置 OnClickListener

c# - 并行运行多个 EntityFramework 数据库查询

ios - 如何从 URL 按顺序而不是一起将图像加载到 imageView?

c# - ASP.Net Core 3.0 Web 应用程序和 Vue 超时异常 Visual Studio 2019 v16.4

c# - 防止立即触发 Quartz.Net 事件

c# - 无法将匿名类型从 'System.Linq.IQueryable' 转换为 'System.Data.Entity.Core.Objects.ObjectQuery'

javascript - 如何跨 android 和 JS bridge 配置通用数据模型?

c# - 以编程方式安排/创建 Skype for Business session

javascript - AsyncAwait 不等待获取响应