首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C#8.0宝藏好物Async streams

之前写《.NET gRPC 核心功能初体验》,利用gRPC双向流做了一个打乒乓Demo,存储消息对象是IAsyncEnumerable,这个异步可枚举泛型接口支撑了gRPC实时流式通信。...(编译器将foreach抓换为强类型方法/属性调用) IEnumerable src = ...; IEnumerator e = src.GetEnumerator(); try { while...这是一个[相互独立长耗时行为集合(假设分别耗时5,4,3,2,1s)], 我们使用C#8.0异步可枚举类型IAsyncEnumerable异步 产生/消费枚举元素。...返回异步方法特征: 以async修饰符声明 返回IAsyncEnumerable对象 方法包含yield return语句,用来异步持续返回元素 static async Task Main(...以上总耗时取决于 耗时最长那个枚举任务:5s ---- .NETCore 3.1 已经可以在webapi中使用异步流,意味着我们可将流式数据返回到HTTP响应。

94430
您找到你想要的搜索结果了吗?
是的
没有找到

总结一下 IEnumerable 例子

IEnumerable及其泛型版本IEnumerable定义了一个类型“可迭代性”。这点很容易理解,系统中很多集合类型都实现了该接口。 因此这些集合类型均可以采用foreach进行迭代遍历。...,因为针对线程安全设计是不同 BlockingCollection.GetConsumingEnumerable方法返回一个会产生阻塞消费者对象, 所以,即使都是丢进foreach,但是效果也是不完全一样...例如在将本地函数、IEnumerable和Task相结合 T10测试网络连接 中。这种写法就减少了传统写法中需要创建一个List或者Array开销。 总之,这种写法,提供了一种新思路。...是否一定要使用,将取决于读者团队接受程度。 异步迭代器 在 C# 8 和 .netcore 3.0 到来版本中,我们迎接到了IAsyncEnumerable接口来实现异步迭代器功能。...IEnumerable是同步方法迭代器,IAsyncEnumerable可以看做是其异步版本。有了这个接口,那么在迭代过程中也可以充分利用async/await带来编程快感。

93200

一文说通异步 LINQ

延迟执行 其实,这儿正确写法也挺简单,用到就是个异步迭代器(关于异步迭代器,如果需要了解,可以看我另一篇推文): static async IAsyncEnumerable Where<T...所谓流执行,其实就是根据调用要求,一次返回一个对象。通过使用异步迭代器,可以不用一次返回所有的对象,而是一个一个地返回单个对象,直到枚举完所有的对象。...通常大多数方法,我们不需要关注上下文,但总有一些需要,在等待异步操作恢复后,需要返回到某个上下文情况。这种情况在 UI 线程编码时通常都需要考虑。很多人提到异步死锁,就是这个原因。...事实上,根据微软对异步 LINQ 约定,每个操作符应该是三种重载: 同步委托实现,就是上面的 Where 方法异步委托实现,这个是指具有异步返回类型实现,通常这种方法名称会用一个 Await...参考微软异步方法,基本上都是以这种结构来命名方法名称。 下面,我们也按这个方式,来做一个 Where 方法几个重载。 WhereAwait 方法 上面说了,这会是一个异步实现。

80710

何在旧版本 .NET Core Framework 中使用 C# 8 异步流(IAsyncDisposable IAsyncEnumerable IAsyncEnumerator)

何在旧版本 .NET Core / Framework 中使用 C# 8 异步流(IAsyncDisposable / IAsyncEnumerable / IAsyncEnumerator)...2020-01-03 09:17 C# 8.0 我们带来了异步流,可以使用 async foreach,不过使用此语法需要 IAsyncEnumerable / IAsyncEnumerator...本文介绍如何在旧版本 .NET Framework 和旧版本 .NET Core 中获得此类型。 ---- 异步流所需版本 异步流需要 .NET Core 3.0 及以上版本才能直接支持。...一点说明:异步流中使用到了 ValueTask,此类型需要 System.Threading.Tasks.Extensions 包支持。...使用异步流 定义支持异步方法 private async IAsyncEnumerable EnumerateTestsAsync() { for (var i = 0; i

1.5K20

聊一聊C# 8.0中await foreach

或者说,C# 8.0中支持异步返回枚举类型async Task>. ? 好吧,还不懂?Good,这篇文章就是你写,看完这篇文章,你就能明白它神奇之处了....Async / Await C# 5 引入了 Async/Await,用以提高用户界面响应能力和对 Web 资源访问能力。换句话说,异步方法用于执行不阻塞线程并返回一个标量结果异步操作。...正如你在输出窗口中看到那样,结果被分成几个部分返回,而不是作为一个值返回。以上显示累积结果被称为惰性枚举。但是,仍然存在一个问题,即 sum 方法阻塞了代码执行。...如果我们想把惰性枚举(yield return)与异步方法结合起来,即返回Task<IEnumerable,这怎么实现呢?...Client/Server异步拉取 如果还没有理解Async Streams好处,那么我借助客户端 / 服务器端架构是演示这一功能优势绝佳方法

1.4K00

C# 8中Async Streams

C# 8添加了异步流(Async Streams),允许异步方法返回多个值,从而扩展了其可用性。 异步流提供了一种用于表示异步数据源绝佳方法。...换句话说,异步方法用于执行不阻塞线程并返回一个标量结果异步操作。 微软多次尝试简化异步操作,因为Async/Await模式易于理解,所以在开发人员当中获得了良好认可。...现有异步方法一个重要不足是它必须提供一个标量返回结果(一个值)。...C# 8中新提出Async Streams去掉了标量结果限制,并允许异步方法返回多个结果。...通常,你不必继承IAsyncEnumerable,但在上面的示例中,微软这样做是为了简化演示,(5)处所示。 (7)处是“foreach”,它从异步内存流中拉取8KB块数据。

1.2K20

.NET 异步编程(异步方法异步委托、CancellationToken、WhenAll、yield)

异步方法异步方法”:用async关键字修饰方法 异步方法返回值一般是Task,T是真正返回类型,Task。惯例:异步方法名字以 Async 结尾。...调用泛型方法时,一般在方法前加上await,这样拿到返回值就是泛型指定T类型异步方法“传染性”:一个方法中如果有await调用,则这个方法也 必须修饰async static async Task...Tips:async是提示编译器异步方法await代码进行分段处理,而一个异步方法是否修饰了async对于方法调用者来讲没区别的,因此对于接口中方法或者抽象方法不能修饰async。...返回Task不一定都要标注async,标注async只是让我们可以更方便await而已。...如果一个异步方法只是对别的异步方法调用转发,并没有太多复杂逻辑(比如等待A结果,再调用B;把A调用返回值拿到内部做一些处理再返回),那么就可以去掉async关键字。

9210

探索 yield 关键字

在EvenSequence方法中,我们使用yield return语句来返回每个偶数值,并在每次暂停后保存方法状态。...在Main方法中,我们使用foreach循环语句来遍历EvenSequence方法返回集合对象,并输出每个偶数值。...,该方法返回一个 IAsyncEnumerable 类型对象。...在方法体中,我们使用一个 for 循环来生成一系列整数,并在每次迭代中异步等待1秒钟。紧接着,我们使用 yield return 语句将生成整数返回给调用方。...总结 使用 yield 关键字可以将一个方法转换为一个返回可枚举对象或迭代器方法,而不必手动实现 IEnumerable 和 IEnumerator 接口 使用 yield 来创建异步生成器,在某些场景下可以实现更高效

14520

ASP.NET Core 性能最佳做法(上)

3避免阻塞调用 ASP.NET Core 应用应设计可同时处理许多请求。异步 API 允许较小线程池处理数千个并发请求,无需等待阻塞调用。...禁止行为: 通过调用 Task.Wait 或 Task.Result 阻止异步执行。 获取常见代码路径中锁。当构建并行运行代码时,ASP.NET Core 应用性能最高。...确定设计是否可能会产生以下不良结果: OutOfMemoryException 或占用大量内存 线程池资源不足(请参阅以下有关 IAsyncEnumerable 注解) 响应时间缓慢 频繁垃圾回收...有关分页和限制返回记录数详细信息,请参阅: 性能注意事项 将分页添加到 ASP.NET Core 应用 5返回IEnumerable或IAsyncEnumerable 从操作返回 IEnumerable...从 ASP.NET Core 3.0 开始,IAsyncEnumerable 可用作异步枚举 IEnumerable 替代方法。有关详细信息,请参阅控制器操作返回类型

1.5K20

异步编程

基本使用“异步方法”:用async关键字修饰方法1) 异步方法返回值一般是Task,T是真正返回类型,Task。...惯例:异步方法名字以Async结尾。2) 即使方法没有返回值,也最好把返回值声明为非泛型Task。...3)调用泛型方法时,一般在方法前加上await关,这样拿到返回值就是泛型指定T类型;4)异步方法“传染性”:一个方法中如果有await调用,则这个方法也必须修饰asyncstatic async...t3);string s1 = results[0];string s2 = results[1];string s3 = results[2];11、异步其他问题接口中异步方法:async是提示编译器异步方法...await代码进行分段处理,而一个异步方法是否修饰了async对于方法调用者来讲没区别的,因此对于接口中方法或者抽象方法不能修饰async。

70930

ASP.NET Core 使用 gRPC 初探

我们可以实现异步请求,从而大大提高了通信效率。...(理论上通过http2.0就可以使用streaming模式, 但是通常web服务Restful api似乎很少这么用,通常流式数据应用视频流,一般都会使用专门协议HLS,RTMP等,这些就不是我们通常...如何.NETCore上使用gRPC? 关于如何在ASP.NETCore上使用gRPC,这里有两种方法,第一是直接创建gRPC模板项目,第二个就是在在ASP.NETCore项目上创建gRPC服务。...:rpc 方法名(请求参数对象名) returns(返回参数对象名) rpc SayHello (HelloRequest) returns (HelloReply); } // 定义请求对象名...到这里就没有问题了,说完了系统默认模板创建方案,那现在我们不用这个方案,尝试一下,如果已经创建好了一个NetCoreAPI项目,比如我Blog.Core,如何在这个基础上,创建gRPC服务呢?

1.5K20

Async,Await和ConfigureAwait关系

但是,使用它们,方法返回类型应为Task类型。(我们将在稍后讨论例外情况)为了使用await关键字,您必须在方法定义中使用async。...HttpContext类型设置,则可以安全地进行此方法调用。...Async Void 虽然几乎所有的async / await方法都应返回某种类型Task,但此规则有一个例外:有时,您可以使用async void。...它实际上是一种即发即忘东西。有两种情况你想要使用它。 第一种情况是事件处理程序,WPF或WinForms中按钮单击。默认情况下,事件处理程序定义必须void。...探讨.NetCore异步注意事项 在.NetCore中已经剔除了SynchronizationContext,剔除他主要原因主要是性能和进一步简化操作 在.NetCore中我们不用继续关心异步同步混用情况下

68010

.NetCoreSpan

so,它是让您花费5分钟以下时间来提升您知识储备量。 正文 在dotnet core2.x之后,引入了一个叫做Span类型。...如果您项目已经升级到了新版dotnet core 以及使用C# 7+。您会发现我们曾经使用许许多多类型都增加了一个扩展方法“AsSpan()”。...而且它拥有了ref关键字,证明它具有ref结构体特点: 不能对 ref struct 装箱 ref struct 类型不能实现接口 不能将 ref struct 声明为类或常规结构字段成员 不能声明异步方法中属于...所以直觉告诉我们,它应该是一个拿来存放数据类型。 so,来看看MSDN - Magazine中它解释: System.Span 是在 .NET 中发挥关键作用新值类型。...这样虽然一波操作猛虎,但是写起来费劲不说,我们还得将传统C#代码设置不安全代码,除了添加unsafe关键字之外还需要打开项目中执行不安全代码选项。

55850

C#8.0 新增功能

弃元表示平局(石头剪刀布游戏)三种组合或其他文本输入。 位置模式 某些类型包含 Deconstruct 方法,该方法将其属性解构离散变量。...08 异步流【*重要*】 从 C# 8.0 开始,可以创建并以异步方式使用流。 返回异步方法有三个属性: 它是用 async 修饰符声明。 它将返回 IAsyncEnumerable。...该方法包含用于在异步流中返回连续元素 yield return 语句。 使用异步流需要在枚举流元素时在 foreach 关键字前面添加 await 关键字。...添加 await 关键字需要枚举异步方法,以使用 async 修饰符进行声明并返回 async 方法允许类型。 通常这意味着返回 Task 或 Task。...方法既可以使用异步流,也可以生成异步流,这意味着它将返回 IAsyncEnumerable

84630
领券