- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个简单的同步方法,如下所示:
public IEnumerable<Foo> MyMethod(Source src)
{
// returns a List of Oof objects from a web service
var oofs = src.LoadOofsAsync().Result;
foreach(var oof in oofs)
{
// transforms an Oof object to a Foo object
yield return Transform(oof);
}
}
由于该方法是 Web 应用程序的一部分,因此最好尽可能有效地使用所有资源。因此,我想将方法更改为异步 方法。最简单的选择是做这样的事情:
public async Task<IEnumerable<Foo>> MyMethodAsync(Source src)
{
var oofs = await src.LoadOofsAsync();
return oofs.Select(oof => Transform(oof));
}
我都不是 async
的专家/await
或 IEnumerable
.然而,据我所知,使用这种方法“扼杀”了 IEnumerable
的好处。 ,因为在加载整个集合之前等待任务,因此省略了 IEnumerable
的“惰性”收藏。
在其他 StackOverflow 帖子中,我阅读了一些使用 Rx.NET 的建议(或 System.Reactive)。快速浏览我读过的文档 IObservable<T>
是他们对 IEnumerable<T>
的异步替代.然而,使用天真的方法并尝试键入以下内容是行不通的:
public async IObservable<Foo> MyMethodReactive(Source src)
{
var oofs = await src.LoadOofsAsync();
foreach(var oof in oofs)
{
yield return Transform(oof);
}
}
我遇到一个编译错误,IObservable<T>
没有实现 GetEnumerator()
, 也不 GetAwaiter()
- 因此它不能同时使用 yield
和 async
.我没有更深入地阅读 Rx.NET 的文档,所以我可能只是错误地使用了这个库。但是我不想花时间去学习一个新的框架去修改单一的方法。
有了新的possibilities in C# 7现在可以实现自定义类型。因此,理论上,我可以实现 IAsyncEnumerable
,这将同时定义 GetEnumerator()
和 GetAwaiter()
方法。但是,根据我以前的经验,我记得我曾尝试创建 GetEnumerator()
的自定义实现,但没有成功。 ...我最终得到了一个隐藏在容器中的简单列表。
因此我们有 4 种可能的方法来解决这个任务:
IEnumerable
IEnumerable
在Task<T>
IAsyncEnumerable
具有 C# 7 功能每种尝试的优点和缺点是什么?其中哪一项对资源利用率的影响最显着?
最佳答案
- Keep the code synchronous, but with IEnumerable
- Change it to asynchronous, but wrap IEnumerable in a Task
- Learn and use Rx.NET (System.Reactive)
- Create a custom IAsyncEnumerable with C# 7 features
What are the benefits and drawbacks of each of these attempts? Which of them has the most significant impact on resource utilization?
在您的情况下,听起来最好的选择是 Task<IEnumerable<T>>
.以下是每个选项的优点:
同步代码(或并行同步代码)在没有 I/O 但大量使用 CPU 时表现出色。如果您有同步等待的 I/O 代码(比如您的第一个方法实现),CPU 只会在等待 Web 服务响应时无所事事地燃烧周期。
Task<IEnumerable<T>>
适用于有 I/O 操作来获取集合的情况。运行等待 I/O 操作的线程可以在等待时安排其他事情。这听起来像你的情况。
Rx 最适合推送场景:其中有数据被“推送”到您要响应的代码。常见示例是接收股票市场定价数据的应用程序或聊天应用程序。
IAsyncEnumerable
适用于当您有一个集合时,每个项目都需要或生成一个异步任务。一个例子:遍历一组项目并为每个项目执行某种独特的数据库查询。如果你的Transform
实际上是 I/O 绑定(bind)异步方法,那么这可能更明智。
关于c# - 异步返回集合的各种方式(具有 C# 7 特性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45921385/
目录 C#特性 1. 概括 2. 语法 定义特性类 应用特性
是否有关于 Python 语言必须提供哪些功能的文章/论文?为什么应该使用 Python 而不是任何其他语言? Python 的优点和缺点是什么? 最佳答案 Why Python和 Why Pytho
我想弄清楚为什么 .x比*.x具有更高的特异性当后者有望获胜时。 不是*.x应该具有 0-0-1-1 的特异性(1 个类,1 个标签)而 .x只是一个类(class) 0-0-1-0 ? 考虑以下基本
在尝试评估非 instanceof 条件时,我发现了我在 Groovy 2.4.7、1.6.0 JVM 中没有预料到的行为。 总之: class Foo { static Boolean
当使用可变结构和属性时,编译器可以解决一些问题,但不能对其他相当明显的事情做同样的事情,这对我来说似乎很奇怪。 以下面的自动属性为例: Vector2 Vector { get; set; } 而不是
我对 ES3 有一定的了解,但我对 ES5 的特性不是很了解。我 - 或多或少 - 知道: Object.create(), Object.freeze() “使用严格” getter 和 sette
我最近开始将 Django 1.5.4 用于带有 MySQL 后端的 Web 应用程序。就在一开始,我遇到了某些限制,这让我想知道 Django 是否是继续前进的正确方法。 一些明显的缺点是: 缺少复
在函数模板的定义中,模板参数的实例化一般是未知的。类型特征可用于在编译时获取一些信息。例如,这是 is_pointer 的一个简单应用: template void foo(T p) { cout
我正在设计页面的样式,该页面具有除最后一个框外的带底部边框的连续框。我为所有框应用类 .box 并添加 .box_last 以仅隐藏最后一个框的边框。 .box { border-bottom-s
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我有兴趣编制一份不建议在嵌入式系统中使用的 c++ 功能列表(这可能会导致人们推荐使用 c 而不是 c++)。如果您知道,请尝试添加原因,或者将您的原因添加到其他人的答案中。 这是一个开始(我知道的唯
作为一名 Ruby 程序员,您是否曾觉得任何使用起来有点冒险的功能,可能是因为它的奇怪行为?它可能有很好的文档记录,但在调试时很难找到,或者难以记住? 我通常尽量远离 String#gsub!。文档说
我正在开发一个连接到健身 watch 的蓝牙应用程序。这是我第一次使用蓝牙。我设法使用出色的 FlutterBlue 将我的应用程序与设备连接起来图书馆。 但是我无法理解我从阅读中获得的结果。这是我阅
1. 迭代器(Iterator)的介绍 背景:指针可以用来遍历存储空间连续的数据结构,但是对于存储空间费连续的,就需要寻找一个行为类似指针的类,来对非数组的数据结构进行遍历。 定义:迭代器是一种检
嗨,伙计们,有没有动态更改 Spring 属性文件内容的好例子?如果您能给我一些示例或链接,我将不胜感激。 非常感谢 最佳答案 我想你可以使用 ReloadableResourceBundleMess
SystemVerilog 引入了一些非常有用的结构来改进编码风格。然而,正如我的一位同事经常说的,“你不是在写软件,你是在描述硬件。”考虑到这一点,当最终结果需要合成时,应该避免语言的哪些特征?这个
我定义了这些测试依赖项 / Test Dependencies lazy val wiremock = "com.github.tomakehurst" % "wir
我正在为 Android 手机和 Android watch (wearOS) 编写应用程序。这些应用程序将通过蓝牙相互通信。基本上,Android 手机上的应用程序将与 WearOS 设备绑定(bi
我正在为 Android 手机和 Android watch (wearOS) 编写应用程序。这些应用程序将通过蓝牙相互通信。基本上,Android 手机上的应用程序将与 WearOS 设备绑定(bi
我有兴趣提高我的设计能力(设计具有属性、方法等的类)。即如何决定类、方法和属性应该是什么? 你们能建议我改进这个的好 Material 吗? 最佳答案 请看: Any source of good o
我是一名优秀的程序员,十分优秀!