.NET 8 MAUI Blazor Hybrid应用iOS端异步调用失效问题排查
.NET 8 MAUI Blazor Hybrid iOS 数据加载异常问题解决
问题现象
- 应用在Android、Windows、iOS均可正常初始化,但仅iOS平台无法加载展示数据,页面空白无刷新
- 断点调试确认核心赋值代码
SharedData.SharedDataBundle = Global.DataBundleCollelction;未执行 - 异步逻辑在iOS上失效:App.Xaml.cs中通过
Task.WhenAll(tasks).Wait()等待两个异步任务完成后加载MainPage,Windows和Android会等待任务执行完毕,iOS直接跳过等待流程 - 补充:最初用
ReadJsonDataAsync读取/Resources/Raw/MyJson.json(MauiAsset)时,传入路径Resources/Raw/MyJsonFile.json在Android、Windows正常,但iOS不兼容
解决步骤
1. 修复iOS异步等待逻辑
避免使用.Wait()这类可能引发线程调度异常的同步阻塞方式,改用异步初始化流程确保任务执行顺序:
// 替换App.Xaml.cs中的同步等待逻辑 protected override async void OnStart() { var task1 = LoadDataAsync1(); var task2 = LoadDataAsync2(); await Task.WhenAll(task1, task2); // 确认数据加载完成后再赋值并初始化主页面 SharedData.SharedDataBundle = Global.DataBundleCollelction; MainPage = new MainPage(); }
注意:MAUI启动阶段应尽量避免同步阻塞异步任务,优先使用异步生命周期方法保证线程上下文正确切换
2. 修复iOS资源文件路径兼容问题
iOS对MauiAsset资源的路径解析逻辑与Android/Windows存在差异,调整资源读取方式:
- 移除路径中的
Resources/Raw/前缀,直接使用文件名 - 使用MAUI内置跨平台API读取资源:
public async Task ReadJsonDataAsync() { // 直接传入资源文件名,无需路径前缀 using var stream = await FileSystem.OpenAppPackageFileAsync("MyJsonFile.json"); using var reader = new StreamReader(stream); var jsonContent = await reader.ReadToEndAsync(); // 反序列化并赋值到全局集合 Global.DataBundleCollelction = JsonSerializer.Deserialize<DataBundleCollection>(jsonContent); }
验证结果
调整异步逻辑和资源读取方式后,iOS平台可正常执行SharedData.SharedDataBundle = Global.DataBundleCollelction;代码,页面成功加载并展示数据。
内容的提问来源于stack exchange,提问作者wafers
相关产品推荐
相关产品推荐

