调用异步方法GetTagsAsync
取数据。
var tmp = (await _repository.GetTagsAsync(id))?.ToList()
如果没有数据的话,返回null。
Task<IEnumerable<Tag>> GetTagsAsync(int id)
{
if (id <= 0)
{
return null;
}
throw new NotImplementedException();
}
然后监控到了异常
System.NullReferenceException: Object reference not set to an instance of an object.
但是调用GetTagsAsync
的地方,已经作了判空处理了,怎么还会出现这个NullReferenceException
呢?
注意,这是一个异步方法,调用方式区别于同步方式,调用者最终通过xxxTask.GetResult()
来拿到结果。
在上述问题场景中,调用者本该拿到异步方法返回的xxxTask,然而得到的却是null
,因此抛出了异常。
解决方法:
Task<IEnumerable<Tag>> GetTagsAsync(int id)
{
if (id <= 0)
{
return Task.FromResult<IEnumerable<Tag>>(null);
}
throw new NotImplementedException();
}
这个问题存在误解。
这不是异步方法,因为不是async
。
所以只要给那个GetTagsAsync
前加上async
就好了。
async Task<IEnumerable<Tag>> GetTagsAsync(int id)
{
if (id <= 0)
{
return null;
}
throw new NotImplementedException();
}