Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步操作不会在等待命令时停止_C#_Android_Asynchronous_Xamarin_Gps - Fatal编程技术网

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

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

我想在Xamarin跨平台应用程序上获取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;
    }
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;
    }
}