为何调用方法中repository.Fetch返回值为null,被调用方法却有值?
问题描述
调用Fetch1方法时,repository.Fetch(id)的返回值始终为null,但单步调试进入repository.Fetch(id)内部时,该方法明明能获取到有效返回值。
Fetch1方法代码如下:
public async Task<ServiceResponse<TVgnItmEstDto>> Fetch1(int id) { ServiceResponse<TVgnItmEstDto> _response = new(); var entity = await repository.Fetch(id); if (entity == null) // 此处entity始终为null { _response.ErrorTitle = "Not Found!"; _response.ErrorMessage = $"{_vgnItmName} not found"; _response.Success = false; _response.Data = null; return _response; } _response.Success = true; _response.Data = mapper.Map<TVgnItmEstDto>(entity); _response.SuccessMessage = $"{_vgnItmName} fetched"; _response.SuccessTitle = "Success!"; return _response; }
可能的原因及排查方向
- 异步方法实现不规范:检查
repository.Fetch(id)的定义,如果它是异步方法但未正确使用async/await,比如直接返回Task.FromResult(null),或者内部有异步操作却没await就提前返回,会导致外层await拿到的是null。比如方法签名是Task<TEntity> Fetch(int id),但内部没正确完成异步逻辑。 - 上下文/实例不一致:如果用了EF Core这类ORM,要确认
Fetch1里的repository实例和调试时的实例是否对应同一个DbContext。不同DbContext实例查询的实体,可能因为跟踪状态问题被判定为null,或者查询的数据源不一样。 - 调试器的中间状态误导:调试器显示的是
repository.Fetch内部某一时刻的变量值,但后续异步操作可能把实体置为null(比如资源释放、代码逻辑修改),最终返回的Task结果还是null。 - 传入的
id实际不匹配:确认调用Fetch1时传入的id和调试时用的id是否完全相同。可能实际调用时用的是不存在的id,但调试时选了存在的id,导致看起来矛盾。 - 线程安全问题:如果
repository不是线程安全的,多线程并发调用时可能出现返回值异常,单步调试是单线程执行,所以没问题,实际运行时多线程出问题。
内容的提问来源于stack exchange,提问作者BeniaminoBaggins
相关产品推荐
相关产品推荐

