You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在视图中使用异步Geolocator服务获取的位置数据?

解决异步获取位置时的死锁问题

你的推测完全正确——直接在构造函数里调用Task.Result会导致UI线程死锁:异步任务GetPositionAsync完成后需要回到UI线程继续执行,但此时UI线程已经被.Result阻塞住,双方互相等待最终引发崩溃。下面是两种可靠的修复方案:

方法1:利用页面Appearing事件处理异步逻辑

构造函数无法标记为async,但页面的Appearing事件处理方法可以。我们把获取位置和添加标记的逻辑移到这里:

public MapPage(List<Models.xxx> xxx, Models.yyy yyy ) {
    InitializeComponent();
    // 订阅Appearing事件,页面显示时执行异步逻辑
    Appearing += OnMapPageAppearing;
}

private async void OnMapPageAppearing(object sender, EventArgs e) {
    // 取消订阅,避免页面多次出现时重复执行逻辑
    Appearing -= OnMapPageAppearing;

    try {
        Tasks ts = new Tasks();
        // 用await正确等待异步任务完成,不会阻塞UI线程
        var myLocation = await ts.GetDeviceCurrentLocation();
        
        var pin1 = new Pin {
            Type = PinType.Place,
            Position = new Position(myLocation.Latitude, myLocation.Longitude),
            Title = "My Location"
        };
        customMap.Pins.Add(pin1);
    }
    catch (Exception ex) {
        // 这里可以添加用户友好的错误提示,比如弹出Toast或对话框
        Debug.WriteLine($"加载位置失败: {ex.Message}");
    }
}

方法2:使用异步初始化方法

如果不想依赖事件,也可以创建一个独立的异步初始化方法,在构造函数中调用(注意不要用.Result阻塞):

public MapPage(List<Models.xxx> xxx, Models.yyy yyy ) {
    InitializeComponent();
    // 调用异步初始化方法,用_丢弃返回值避免编译器警告
    _ = InitializeMapAsync();
}

private async Task InitializeMapAsync() {
    try {
        Tasks ts = new Tasks();
        var myLocation = await ts.GetDeviceCurrentLocation();
        
        var pin1 = new Pin {
            Type = PinType.Place,
            Position = new Position(myLocation.Latitude, myLocation.Longitude),
            Title = "My Location"
        };
        customMap.Pins.Add(pin1);
    }
    catch (Exception ex) {
        Debug.WriteLine($"加载位置失败: {ex.Message}");
    }
}

额外提醒

  • 永远不要在UI线程用.Result或.Wait()阻塞异步任务,这是死锁的高频诱因。
  • 务必处理异常:异步任务可能因权限不足、定位服务未开启、超时等原因失败,try-catch能避免程序崩溃并给用户反馈。
  • 可添加加载状态:比如在获取位置时显示ActivityIndicator,让用户感知到程序在后台工作,提升体验。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:24:07