首页 新闻 会员 周边 捐助

.net async/await异步方法返回null的问题

1
[已解决问题] 解决于 2017-03-22 11:04

调用异步方法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呢?

蝌蝌的主页 蝌蝌 | 初学一级 | 园豆:158
提问于:2017-03-22 10:58
< >
分享
最佳答案
1

注意,这是一个异步方法,调用方式区别于同步方式,调用者最终通过xxxTask.GetResult()来拿到结果。

在上述问题场景中,调用者本该拿到异步方法返回的xxxTask,然而得到的却是null,因此抛出了异常。

解决方法:

        Task<IEnumerable<Tag>> GetTagsAsync(int id)
        {
            if (id <= 0)
            {
                return Task.FromResult<IEnumerable<Tag>>(null);
            }
            throw new NotImplementedException();
        }
蝌蝌 | 初学一级 |园豆:158 | 2017-03-22 11:02

这个问题存在误解。
这不是异步方法,因为不是async

所以只要给那个GetTagsAsync前加上async就好了。

       async Task<IEnumerable<Tag>> GetTagsAsync(int id)
        {
            if (id <= 0)
            {
                return null;
            }
            throw new NotImplementedException();
        }
蝌蝌 | 园豆:158 (初学一级) | 2017-03-22 11:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册