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

.NET Maui应用iOS端HealthKit回调与HttpClient协同工作异常问题

问题解决方法

你遇到的核心问题是**await _healthData.GetSteps()根本没起到等待回调完成的作用**——这个GetSteps是基于Completion Handler的旧写法,并非真正的异步Task方法,代码会直接跳过回调执行后续逻辑,此时steps还是初始值0,自然赋值给fitness.Steps时不对。

直接调整异步逻辑即可解决:

1. 把回调式的GetSteps包装成可等待的Task

如果_healthData是你维护的代码,直接重构GetSteps返回Task<double>:

public Task<double> GetSteps()
{
    var tcs = new TaskCompletionSource<double>();
    // 替换为你原本的GetSteps内部实现逻辑,用回调结果完成Task
    YourOriginalGetStepsImpl((totalSteps) =>
    {
        SentrySdk.CaptureMessage("totalSteps = " + totalSteps);
        tcs.SetResult(totalSteps);
    });
    return tcs.Task;
}

如果无法修改_healthData,就在调用层新增包装方法:

private Task<double> GetStepsAsync()
{
    var tcs = new TaskCompletionSource<double>();
    _healthData.GetSteps((totalSteps) =>
    {
        SentrySdk.CaptureMessage("totalSteps = " + totalSteps);
        tcs.SetResult(totalSteps);
    });
    return tcs.Task;
}

2. 重写UploadData方法

用包装后的异步方法调用,确保拿到正确步数后再执行后续逻辑:

public async Task<double> UploadData()
{
    // 这里会真正等待回调完成,获取正确的totalSteps
    double steps = await GetStepsAsync();

    SentrySdk.CaptureMessage("UploadData steps = " + steps);

    var fitness = new Fitness();
    fitness.Steps = steps;

    await _restService.SaveItemAsync(fitness, true);

    return steps;
}

额外提醒

  • Android端正常是巧合,只是回调执行速度比后续代码快,本质写法存在问题,极端场景下也会出现bug,当前写法能统一修复两端的逻辑漏洞。
  • 卡路里、活动时长、距离等其他数据的上传,都可以用同样的方式包装对应的回调方法,保证异步逻辑的正确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 14:20:49