【发布时间】:2015-10-22 06:44:43
【问题描述】:
我需要在我的核心接口中定义返回列表的方法。我的项目严重依赖 async/await 的使用,因此我需要将我的核心引用/接口定义为尽可能异步。我还将 EF7 用于我的数据访问层。我目前在任何地方都使用IAsyncEnumerable。
我目前正在决定是继续使用IAsyncEnumerable 还是恢复使用Task<IEnumerable<T>>。 IAsyncEnumerable 在这一点上似乎很有希望。 EF7 也是using。问题是,我不知道也无法弄清楚如何使用它。 website 上几乎没有任何内容告诉任何人如何使用 Ix.Net。我可以在IEnumerable 对象上使用ToAsyncEnumerable 扩展,但这不会异步执行任何操作(或者是吗??)。另一个缺点是给定以下签名:
IAsyncEnumerable GetPersons();
因为这不是一个返回Task的函数,所以我不能在函数块内使用async/await。
另一方面,我的直觉告诉我应该坚持使用Task<IEnumerable<T>>。这当然也有它的问题。 EF 没有返回此类型的扩展方法。它有一个ToArrayAsync 和ToListAsync 扩展方法,但这当然需要你在方法内部调用await,因为Task<T> 不是协变的。这可能是一个问题,因为这会创建一个额外的 操作,如果我简单地返回 Task 对象,就可以避免这种情况。
我的问题是:我应该继续使用IAsyncEnumerable(首选)还是应该将所有内容改回Task<IEnumerable<T>>(不首选)?我也愿意接受其他建议。
【问题讨论】:
-
您似乎了解每个选项的缺点。剩下的就是意见。我的在 IAsyncEnumerable 一边。
-
谢谢。你能用为什么你认为它是更好的选择来支持它吗?
-
因为它是惰性和异步的。这就是未来。
-
我同意它是懒惰的,这就是我喜欢它的地方。你有什么可以帮助我学习如何使用它的吗?
-
试错?这都是新东西。您可以克隆他们的代码并在其中查看哪些操作可用...
标签: c# .net async-await system.reactive entity-framework-core