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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 12:42:40