提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|使用教程|编辑:吴园园|2019-10-21 10:04:16.260|阅读 347 次
概述:本文将为您带来异步流– C#8中的新语言功能介绍。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
ReSharper是一个著名的代码生成工具,其能帮助Microsoft Visual Studio成为一个更佳的IDE。实质上,ReSharper特征可用于C#,VB.net,XML,Asp.net,XAML,和构建脚本。
ReSharper Ultimate 2019.2提供了对C#8.0的更好支持以及一些Navigation,Find Usages和调试器数据提示的更新。它还改善了启动时间,并为VS 2019中的“Per-Monitor DPI Awareness”模式提供了初始支持.C ++项目的索引更快,支持更多C ++ 20功能。点击查看更新详情!
自从C#8系列的最后一部分以来已经有一段时间了,但是它来了!我们将继续通过新的语言功能进行探索,并深入到异步流中。
在本系列中,我们正在研究:
指数,范围和空值分配
切换表达式和基于模式的用法
递归模式匹配
异步流
异步编程是一种编程形式,它可以通过允许将耗时的工作(例如从网络下载数据)与主线程分离来防止阻塞我们的应用程序。对于我们的实现,原则上,它需要将回调传递给异步方法,该异步方法又会在完成工作后调用该回调。
在C#5中,引入了async和await关键字。这些从根本上改善了我们编写和使用异步方法的方式。基本上,与同步实现相比,我们的代码结构可以保持几乎相同,但是编译器接管了很多工作,将我们的代码重组为上述回调,以使其具有状态且无阻塞。但是,这仅适用于使用Task和Task<T>作为返回类型的void和单结果方法。
产生数据流的方法(又名IEnumerable<T>)被省去了,需要编写自定义代码。但是,此类要求非常普遍,例如考虑使用云应用程序,从IoT传感器收集数据或从数据库接收数据。,C#8和IAsyncEnumerable!
随着.NET 2.1标准的发布,引入了一组3个接口: IAsyncDisposable,IAsyncEnumerable<T>和IAsyncEnumerator<T>。这些接口允许我们以某种方式表示的异步版本IEnumerable<T>,从而使用异步流:
public interface IAsyncDisposable { ValueTask DisposeAsync(); } public interface IAsyncEnumerable<out T> { IAsyncEnumerator<T> GetAsyncEnumerator(CancellationToken token = default); } public interface IAsyncEnumerator<out T> : IAsyncDisposable { ValueTask<bool> MoveNextAsync(); T Current { get; } }
为了IAsyncEnumerable<T>在各种情况下都能正常工作(如await在finally块中一样),我们还需要IDisposable接口的异步版本。您可能已经猜到了,它叫做IAsyncDisposable:
public interface IAsyncDisposable { ValueTask DisposeAsync(); }
从.NET Core SDK 3.0开始,实际上已经实现了这些类型,并且使用C#8 foreach,using可以将and 关键字作为前缀await与IAsyncEnumerableand IAsyncDisposable实例一起使用。
IAsyncEnumerable<T>实质上,迭代意味着获取下一个对象成为异步操作,而foreach主体成为我们的回调。只有当我们继续循环时,才会提取一个新项目(与调用相对break)。这基本上将这种方法标记为基于拉的方法。该await foreach语句还基于模式工作,这意味着它将与提供适当GetAsyncEnumerator方法但不实现IAsyncEnumerable<T>接口的任何类型一起工作。
让我们看看如何将这些添加项组合使用。好奇的开发人员绝对应该抓住机会,看看它的反编译代码:
static async Task Main() { await foreach (var data in ReadAndNormalize()) { Console.WriteLine(data); } } static async IAsyncEnumerable<Data> ReadAndNormalize( [EnumeratorCancellation] CancellationToken token = default) { while (!token.IsCancellationRequested) { var data = await ReadInputFromDevice(); var normalizedData = ConvertAndNormalize(data); yield return normalizedData; } } static async Task<byte[]> ReadInputFromDevice() { return default; } static Data ConvertAndNormalize(byte[] data) { return default; } struct Data { }
请注意,CancellationToken标记有一个EnumeratorCancellation属性。与JetBrains.Annotations包中的EnumeratorCancellation属性相似,该属性(包含在中System.Runtime.CompilerServices)将代码片段标记为其他魔术,这些魔术目前还无法用语言本身来表达。
如前所述,using语句现在也可以使用await关键字作为前缀。让我们一起来看看!
async Task WriteToFileAsync(string file) { await using (var fs = new FileStream(file, FileMode.CreateNew)) await using (var sw = new StreamWriter(fs)) { await sw.WriteAsync("Hello C#8!"); } }
由于.NET标准2.1,两个所涉及的类型FileStream,并StreamWriter都实现IAsyncDisposable。这样就可以异步完成所有处理工作,例如刷新磁盘更改。
ReSharper和Rider能为我做什么?
除了解析新的语言结构外,ReSharper和Rider还带来了其他一些有助于异步流工作的优点。
从我们可以枚举的最明显的操作开始,foreach 后缀模板已更新为完成,await foreach直到有问题的枚举类型为IAsyncEnumerable<T>或匹配其模式:
在最后一个示例中,我们犯了一个错误。我们没有通过取消令牌!幸运的是,这里进行了新的代码检查,并提供了一个快速修复程序来使事情正确:
等等,还有另一个棘手的示例,其中ReSharper和Rider将注意到可以使用WithCancellation扩展方法传递取消令牌。还记得EnumeratorCancellation我们提到的属性吗?这将允许编译器用与原始令牌组合的有效取消令牌替换取消令牌的每种用法IAsyncEnumerator:
每当我们想要返回an IAsyncEnumerable<T>但该方法尚未标记时async,ReSharper和Rider都会建议从方法名称区域或从await出现的关键字中返回:
同样,当我们使用已标记为的方法时async,ReSharper和Rider将允许从错误定义的IEnumerable<T>返回类型更改为IAsyncEnumerable<T>:
在消费方面,另一种快速修复方法是将同步foreach语句更改为异步await foreach语句。在转换现有代码以利用新的语言功能时,这可能很有用:
最后但并非最不重要的一点,让我们回到IAsyncDisposable并等待使用。如果方法是async,并且所讨论的对象实现了异步对象DisposeAsync,则Rider和ReSharper将显示检查结果,await using可以代替使用。同样,我们可以将await using语句转换为基于模式的using中描述的声明。相应的快速修复可以在范围内应用:
=====================================================
想要了解或购买ReSharper正版授权的朋友,欢迎
关注下方“慧聚IT”微信公众号,及时获取产品最新消息和最新资讯
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@cahobeh.cn
文章转载自:本文探讨 SQL Server 中 NULL 和空值之间的区别,并讨论如何有效地处理它们。
Unity 是一款功能极其丰富的游戏引擎,允许开发人员将各种媒体集成到他们的项目中。但是,它缺少最令人兴奋的功能之一 - 将 Web 内容(例如 HTML、CSS 和 JavaScript)直接渲染到 3D 场景中的纹理上的能力。在本文中,我们将介绍如何使用 DotNetBrowser 在 Unity3D 中将 Web 内容渲染为纹理。
DevExpress v24.2帮助文档正式发布上线了,请按版本按需下载~
本教程将向您展示如何用MyEclipse构建一个Web项目,欢迎下载最新版IDE体验!
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@cahobeh.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢