.NET 5调用返回Task的方法时报错运算符/无法应用于int和Task类型
问题原因
报错的核心是两个常见的异步方法使用错误:
- 你定义的
GetMidRateInEuro方法返回值是无泛型参数的Task,既没有明确返回值类型,还存在逻辑冲突:查询成功返回decimal类型的汇率,查询失败返回bool类型的false,调用方无法正常拿到有效数值 - 调用异步方法没有加
await关键字获取执行结果,导致你拿到的midrate变量是Task类型的对象,不是你期望的数值类型,自然无法参与除法运算
修复步骤
第一步:修正异步方法定义,统一返回值类型
将方法返回值改为泛型Task<decimal?>,表示返回可空的decimal类型汇率,同时优化为标准异步查询逻辑:
// 明确返回可空decimal类型的异步任务 public async Task<decimal?> GetMidRateInEuro(string currencypair) { using (var db = this.dbContextFactory.Create()) { try { // 改用EF Core异步查询方法,符合异步方法设计规范 var midrate = await db.Fxrates .Where(s => s.CurrencyPair == currencypair) .Select(r => r.MidRate) .FirstOrDefaultAsync(); // 查不到直接返回null即可,不需要返回bool值 return midrate; } catch (Exception ex) { this.logger.Log($"{currencypair} midrate {ex.Message}", true); // 直接用throw代替throw ex,避免清空异常调用栈 throw; } } }
第二步:修正调用逻辑,加await获取实际计算值
给调用方方法加上async修饰,调用异步方法时加await获取实际汇率,同时增加有效性判断避免计算异常:
// 加await获取实际的decimal?类型汇率值 var midrate = await GetMidRateInEuro("EUR" + currency); // 增加空值和零值判断,避免除零错误或者空引用报错 if (midrate == null || midrate == 0) { // 此处可根据业务需求补充异常处理逻辑,或者赋值默认汇率 throw new InvalidOperationException($"未获取到{currency}对欧元的有效汇率"); } var amountInEurto = accumulatedAmount * (1 / midrate.Value);
注意事项
如果调用GetMidRateInEuro的方法确实无法改造为异步方法,万不得已可以用var midrate = GetMidRateInEuro("EUR" + currency).GetAwaiter().GetResult();同步等待执行结果,但该方案存在线程死锁风险,优先选择await异步调用方案。
内容的提问来源于stack exchange,提问作者moris62
相关产品推荐
相关产品推荐

