加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何异步地正确返回一组对象?

发布时间:2020-12-15 23:28:28 所属栏目:百科 来源:网络整理
导读:我需要在核心界面中定义返回列表的方法.我的项目很大程度上依赖于使用async / await所以我需要将我的核心引用/接口定义为尽可能异步.我还将EF7用于我的数据访问层.我目前在任何地方都使用IAsyncEnumerable. 我目前正在决定是继续使用IAsyncEnumerable还是恢
我需要在核心界面中定义返回列表的方法.我的项目很大程度上依赖于使用async / await所以我需要将我的核心引用/接口定义为尽可能异步.我还将EF7用于我的数据访问层.我目前在任何地方都使用IAsyncEnumerable.

我目前正在决定是继续使用IAsyncEnumerable还是恢复使用Task< IEnumerable< T>>. IAsyncEnumerable在这一点似乎很有希望. EF7也是using.麻烦的是,我不知道也无法弄清楚如何使用它. website上几乎没有任何内容告诉任何人如何使用Ix.Net.有一个ToAsyncEnumerable扩展,我可以在IEnumerable对象上使用,但这不会异步(或者它?).另一个缺点是给出以下签名:

IAsyncEnumerable GetPersons();

因为这不是返回Task的函数,所以我不能在函数块中使用async / await.

另一方面,我的直觉告诉我,我应该坚持使用Task< IEnumerable< T>>.这当然也有它的问题. EF没有返回此类型的扩展方法.它有一个ToArrayAsync和ToListAsync扩展方法,但这当然要求你在方法内部调用await,因为Task< T>是不协变的.这可能是一个问题,因为这会创建一个额外的操作,如果我只是返回Task对象就可以避免.

我的问题是:我应该继续使用IAsyncEnumerable(首选)还是应该将所有内容更改回Task< IEnumerable< T>> (不是首选)?我也对其他建议持开放态度.

解决方法

我会选择IAsyncEnumerable.它允许您使您的操作保持异步和惰性.

没有它你需要返回Task< IEnumerble>这意味着您将所有结果加载到内存中.在许多情况下,这意味着查询并保存比所需更多的内存.

经典案例是有一个用户调用Any的查询.如果是任务< IEnumerable>它会首先将所有结果加载到内存中,如果是IAsyncEnumerable加载一个结果就足够了.

与Task< IEnumerable>相关也是如此.你需要同时在内存中保存整个结果集,而使用IAsyncEnumerable,你可以一次“流”一些结果.

而且,这是生态系统走向的方向.它是通过反应性扩展添加的,本周仅为new library suggested by Stephen Toub,可能是supported in the next version of C# natively.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读