繁体   English   中英

异步操作不会在等待命令时停止

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM