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

C# Xamarin中获取Task返回值导致代码崩溃问题求助

问题原因
  • 核心问题是UI线程死锁:你在UI线程执行的WebNavigating事件里用.Result同步阻塞等待异步Task返回,Xamarin默认的异步上下文会要求await后的代码回到原调用线程(也就是UI线程)执行,此时UI线程已经被.Result堵死等待Task完成,Task也在等待UI线程空闲才能执行完后续逻辑,两方互相等待形成死锁,直接触发崩溃或程序无响应。
  • 第二个潜在问题是方法名拼写错误:你的MyClass中定义的异步方法名为MyFontion,但调用时写的是MyFunction,拼写不一致会直接导致编译错误,运行时也会抛出异常。
  • 第三个问题是未捕获异步异常:异步方法中抛出的异常会被包裹在Task中,如果没有对应的捕获逻辑,用.Result读取时会抛出未处理的AggregateException直接导致崩溃。
修复方案
  1. 把WebNavigating事件处理器改为async void(事件处理器是C#唯一允许合法使用async void的场景),用await替代.Result获取异步返回值,避免阻塞UI线程
  2. 修正方法名拼写,保证定义和调用的方法名一致
  3. 增加异常捕获逻辑,处理异步执行过程中可能出现的异常

修正后的CS页面代码

public partial class AuthPage : ContentPage
{
    public AuthPage()
    {
        InitializeComponent();
        Browser.Source = "https://www.google.com";
    }

    // 改为async void,适配异步调用
    private async void WebNavigating(object sender, WebNavigatingEventArgs e)
    {
        try
        {
            var myClass = new MyClass();
            // 用await替代.Result,同时修正方法名拼写和定义一致
            var ctrl = await myClass.MyFontion(aValue);
            if (ctrl)
            {
                // 原有业务逻辑
            }
        }
        catch (Exception ex)
        {
            // 可添加日志输出、用户提示等逻辑,避免未捕获异常崩溃
            Console.WriteLine($"执行出错:{ex.Message}");
        }
     }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:27:03