当前位置: 首页 > news >正文

红河网站建设企业网站作用

红河网站建设,企业网站作用,服装网站建设的目的,网易企业邮箱入口登录在 C# 中利用 ValueTask 避免从异步方法返回 Task 对象时分配翻译自 Joydip Kanjilal 2020年7月6日 的文章 《How to use ValueTask in C#》(https://www.infoworld.com/article/3565433/how-to-use-valuetask-in-csharp.html)异步编程已经使用了相当长一段时间了。近年来… 在 C# 中利用 ValueTask 避免从异步方法返回 Task 对象时分配翻译自 Joydip Kanjilal 2020年7月6日 的文章 《How to use ValueTask in C#》(https://www.infoworld.com/article/3565433/how-to-use-valuetask-in-csharp.html)异步编程已经使用了相当长一段时间了。近年来随着 async 和 await 关键字的引入它变得更加强大。您可以利用异步编程来提高应用程序的响应能力和吞吐量。C# 中异步方法的推荐返回类型是 Task。如果您想编写一个有返回值的异步方法那么应该返回 TaskT; 如果想编写事件处理程序则可以返回 void。在 C# 7.0 之前异步方法可以返回 Task、TaskT 或 void。从 C# 7.0 开始异步方法还可以返回 ValueTask作为 System.Threading.Tasks.Extensions 包的一部分可用或 ValueTaskT。本文就讨论一下如何在 C# 中使用 ValueTask。要使用本文提供的代码示例您的系统中需要安装 Visual Studio 2019。如果还没有安装您可以在这里下载 Visual Studio 2019https://visualstudio.microsoft.com/downloads/。在 Visual Studio 中创建一个 .NET Core 控制台应用程序项目首先让我们在 Visual Studio 中创建一个 .NET Core 控制台应用程序项目。假设您的系统中安装了 Visual Studio 2019请按照下面描述的步骤在 Visual Studio 中创建一个新的 .NET Core 控制台应用程序项目。启动 Visual Studio IDE。点击 “创建新项目”。在 “创建新项目” 窗口中从显示的模板列表中选择 “控制台应用(.NET Core)”。点击 “下一步”。在接下来显示的 “配置新项目” 窗口指定新项目的名称和位置。点击 “创建”。这将在 Visual Studio 2019 中创建一个新的 .NET Core 控制台应用程序项目。我们将在本文后面的部分中使用这个项目来说明 ValueTask 的用法。为什么要使用 ValueTask Task 表示某个操作的状态即此操作是否完成、取消等。异步方法可以返回 Task 或者 ValueTask。现在由于 Task 是一个引用类型从异步方法返回一个 Task 对象意味着每次调用该方法时都会在托管堆managed heap上分配该对象。因此在使用 Task 时需要注意的一点是每次从方法返回 Task 对象时都需要在托管堆中分配内存。如果你的方法执行的操作的结果立即可用或同步完成则不需要这种分配因此代价很高。这正是 ValueTask 要出手相助的目的ValueTaskT 提供了两个主要好处。首先ValueTaskT 提高了性能因为它不需要在堆heap中分配; 其次它的实现既简单又灵活。当结果立即可用时通过从异步方法返回 ValueTaskT 代替 TaskT你可以避免不必要的分配开销因为这里的 “T” 表示一个结构而 C# 中的结构体struct是一个值类型与 TaskT 中表示类的 “T” 不同。C# 中 Task 和 ValueTask 表示两种主要的 “可等待awaitable” 类型。请注意您不能阻塞block一个 ValueTask。如果需要阻塞则应使用 AsTask 方法将 ValueTask 转换为 Task然后在该引用 Task 对象上进行阻塞。另外请注意每个 ValueTask 只能被消费consumed一次。这里的单词 “消费consume” 是指 ValueTask 可以异步等待await操作完成或者利用 AsTask 将 ValueTask 转换为 Task。但是ValueTask 只应被消费consumed一次之后 ValueTaskT 应被忽略。C# 中的 ValueTask 示例假设有一个异步方法返回一个 Task。你可以利用 Task.FromResult 创建 Task 对象如下面给出的代码片段所示。public Taskint GetCustomerIdAsync() {return Task.FromResult(1); } 上面的代码片段并没有创建整个异步状态机制但它在托管堆managed heap中分配了一个 Task 对象。为了避免这种分配您可能希望利用 ValueTask 代替像下面给出的代码片段所示的那样。public ValueTaskint GetCustomerIdAsync() {return new ValueTaskint(1); } 下面的代码片段演示了 ValueTask 的同步实现。public interface IRepositoryT {ValueTaskT GetData(); } Repository 类扩展了 IRepository 接口并实现了如下所示的方法。public class RepositoryT : IRepositoryT {public ValueTaskT GetData(){var value default(T);return new ValueTaskT(value);} } 下面是如何从 Main 方法调用 GetData 方法。static void Main(string[] args) {IRepositoryint repository new Repositoryint();var result repository.GetData();if (result.IsCompleted)Console.WriteLine(Operation complete...);elseConsole.WriteLine(Operation incomplete...);Console.ReadKey(); } 现在让我们将另一个方法添加到我们的存储库repository中这次是一个名为 GetDataAsync 的异步方法。以下是修改后的 IRepository 接口的样子。public interface IRepositoryT {ValueTaskT GetData();ValueTaskT GetDataAsync(); } GetDataAsync 方法由 Repository 类实现如下面给出的代码片段所示。public class RepositoryT : IRepositoryT {public ValueTaskT GetData(){var value default(T);return new ValueTaskT(value);}public async ValueTaskT GetDataAsync(){var value default(T);await Task.Delay(100);return value;} } C# 中应该在什么时候使用 ValueTask ?尽管 ValueTask 提供了一些好处但是使用 ValueTask 代替 Task 有一定的权衡。ValueTask 是具有两个字段的值类型而 Task 是具有单个字段的引用类型。因此使用 ValueTask 意味着要处理更多的数据因为方法调用将返回两个数据字段而不是一个。另外如果您等待(await)一个返回 ValueTask 的方法那么该异步方法的状态机也会更大因为它必须容纳一个包含两个字段的结构体而不是在使用 Task 时的单个引用。此外如果异步方法的使用者使用 Task.WhenAll 或者 Task.WhenAny在异步方法中使用 ValueTaskT 作为返回类型可能会代价很高。这是因为您需要使用 AsTask 方法将 ValueTaskT 转换为 TaskT这会引发一个分配而如果使用起初缓存的 TaskT则可以轻松避免这种分配。经验法则是这样的当您有一段代码总是异步的时即当操作总是不能立即完成时请使用 Task。当异步操作的结果已经可用时或者当您已经缓存了结果时请利用 ValueTask。不管怎样在考虑使用 ValueTask 之前您都应该执行必要的性能分析。ValueTask 是 readonly struct 类型Task 是 class 类型。相关链接C# 中 Struct 和 Class 的区别总结。作者 Joydip Kanjilal 译者 技术译民出品 技术译站https://ITTranslator.cn/
http://www.pierceye.com/news/875013/

相关文章:

  • 读书网站建设策划书摘要推荐网站建设案例
  • 西安网站建设 大德wordpress图片浏览
  • 陕西建设注册中心网站网页设计与制作长江职业学院
  • 佛山网站设计外包有没有做淘宝客网站的
  • 手机怎么做3d短视频网站网站开发工程师php岗位职责
  • 莆田做网站公司电话人才网站建设方案
  • 找人做网站需要问哪些问题桂林漓江悦府
  • 专门做2次元图片的网站高清vpswindows在线看
  • 青岛手机建站公司网站源码com大全
  • 电脑搭建网站需要空间wordpress文件夹权限设置方法
  • 建设网站基础医疗网站建设比较好的
  • 建个网站视频教程小程序开发是前端还是后端
  • 广州分享网站建设网站速度查询
  • 做电商网站价钱传奇类网页游戏大全
  • 如何选择南京网站建设网站制作能赚多少钱
  • 一站式网站设计已有域名如何在花生壳网站做二级域名托管
  • 哪个网站可以接图纸做返利网站怎么做的
  • 旅游网站建设国内外现状辽阳专业建设网站公司
  • 免费视频模板网站wordpress不写代码
  • 设计网站公司 露 联湖南岚鸿小程序网站开发公司
  • 聊城网站设计seo公司重庆
  • 网站布局技术厦门网站建设680元
  • 深圳物流公司网站建e网怎么做效果图
  • 做营销网站公司建个个人网站一年多少钱
  • 阆中网站网站建设代理网络服务器
  • 企业网站新模式seo排名推广工具
  • 山东做网站三五个人网页设计作品简单
  • 福州网站建设软件网站做了301怎么查看跳转前网站
  • 网站开发竞品分析网站开发与规划
  • 香山红叶建设有限公司网站网络营销方式落后的表现