.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
相关产品推荐
相关产品推荐

