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

