返回顶部
首页 > 资讯 > 精选 >.Net如何通过TaskFactory.FromAsync简化APM
  • 590
分享到

.Net如何通过TaskFactory.FromAsync简化APM

2023-07-02 10:07:39 590人浏览 八月长安
摘要

这篇文章主要介绍“.net如何通过TaskFactory.FromAsync简化APM”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“.Net如何通过TaskFactory.FromAsync简化AP

这篇文章主要介绍“.net如何通过TaskFactory.FromAsync简化APM”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“.Net如何通过TaskFactory.FromAsync简化APM”文章能帮助大家解决问题。

异步执行 I/O 密集型操作是生产高响应和可伸缩应用程序及组件的关键。可让您使用极少量的线程来执行大量的工作,而无需阻止任何线程。然而异步编程却有些麻烦,许多程序员不愿意去做它。

网上有不少通过lambda 表达式和AsyncEnumerator 等来实现简化异步编程的方法,这些方法也确实行之有效,但在.net 4.0中,我们又多了一种选择——通过TaskFactory.FromAsync简化APM。

TaskFactory.FromAsync这个方法非常简单,通过它可以把一个异步的任务转换为一个Task,首先我们来看一个简单的例子吧:

    static IEnumerable<Task> CopyStreamAsync(Stream input, Stream output)    {        var buffer = new byte[0x2000];        while (true)        {            var readTask = Task<int>.Factory.FromAsync(input.BeginRead, input.EndRead, buffer, 0, buffer.Length, null);            yield return readTask;            if (readTask.Result == 0)                break;            yield return Task.Factory.FromAsync(output.BeginWrite, output.EndWrite, buffer, 0, buffer.Length, null);        }    }

这个例子通过TaskFactory.FromAsync把一系列异步操作转换为了一个任务列。虽然这些都是异步操作,但在函数中却和同步操作一样直观,十分简单而清晰。

转换为了的任务列后,我们就需要来执行这一系列任务,最简单的方法如下:

    foreach (var task in CopyStreamAsync(input, output))    {        task.Wait();    }

这种方式虽然直接有效,但它却是一种阻塞式的操作,没有达到异步的目的,我们一般可以通过如下方式把这个任务列转换为一个任务,从而实现异步执行。

    public static Task Iterate(this TaskFactory factory, IEnumerable<Task> asyncIterator)    {        var scheduler = factory.Scheduler ?? TaskScheduler.Current;        // Get an enumerator from the enumerable        var enumerator = asyncIterator.GetEnumerator();        if (enumerator == null) throw new InvalidOperationException();        // Create the task to be returned to the caller. And ensure        // that when everything is done, the enumerator is cleaned up.        var trs = new TaskCompletionSource<object>(factory.CreationOptions);        trs.Task.ContinueWith(_ => enumerator.Dispose(), scheduler);        // This will be called every time more work can be done.        Action<Task> recursiveBody = null;        recursiveBody = antecedent =>        {            try            {                // If the previous task completed with any exceptions, bail                if (antecedent != null && antecedent.IsFaulted)                    trs.TrySetException(antecedent.Exception);                else if (trs.Task.IsCanceled) trs.TrySetCanceled();                else if (enumerator.MoveNext())                    enumerator.Current.ContinueWith(recursiveBody, scheduler);                // Otherwise, we're done!                else trs.TrySetResult(null);            }            // If MoveNext throws an exception, propagate that to the user            catch (Exception exc) { trs.TrySetException(exc); }        };        // Get things started by launching the first task        factory.StartNew(_ => recursiveBody(null), scheduler);        // Return the representative task to the user        return trs.Task;    }

这个函数我是摘录自ParallelProgrammingSamples中的,里面还有好几种其它的调用形式,可以根据需要选择合适的方法。

关于“.Net如何通过TaskFactory.FromAsync简化APM”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: .Net如何通过TaskFactory.FromAsync简化APM

本文链接: https://lsjlt.com/news/341255.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • .Net通过TaskFactory.FromAsync简化APM
    异步执行 I/O 密集型操作是生产高响应和可伸缩应用程序及组件的关键。可让您使用极少量的线程来执行大量的工作,而无需阻止任何线程。然而异步编程却有些麻烦,许多程序员不愿意去做它。 网...
    99+
    2024-04-02
  • .Net如何通过TaskFactory.FromAsync简化APM
    这篇文章主要介绍“.Net如何通过TaskFactory.FromAsync简化APM”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“.Net如何通过TaskFactory.FromAsync简化AP...
    99+
    2023-07-02
  • 如何解析异步编程In .NET APM/EAP和async/await
    如何解析异步编程In .NET APM/EAP和async/await,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。概述在之前写的一篇关于async和await的前世今生的文章...
    99+
    2023-06-17
  • PHP8中如何通过Constructor Property Promotion简化类的构造函数?
    PHP8中如何通过Constructor Property Promotion简化类的构造函数?在PHP8中,引入了Constructor Property Promotion(构造函数属性推广)特性,这使得编写类的构造函数更加简洁和高效。...
    99+
    2023-10-22
    PHP constructor Property Promotion
  • Python 和 Linux:如何通过加载数据类型来简化编程?
    Python 和 Linux 都是非常流行的开发平台,两者的结合可以实现非常强大的功能。其中,Python 作为一种高级编程语言,具有很多优势,如易读性、简洁性和灵活性等。而 Linux 则是一种广泛使用的操作系统,其优势在于其开放性和可...
    99+
    2023-07-04
    linux 数据类型 load
  • 如何使用go net实现简单的redis通信协议
    这篇文章主要为大家展示了“如何使用go net实现简单的redis通信协议”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用go net实现简单的redis通信协议”这篇...
    99+
    2023-06-21
  • 如何通过循环优化JavaScript 程序
    这篇文章给大家分享的是有关如何通过循环优化JavaScript 程序的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言对于提高 JavaScript 程序的性能这个问题,最简单同...
    99+
    2024-04-02
  • 如何使用Windows兼容包简化向.NET Core的迁移
    今天就跟大家聊聊有关如何使用Windows兼容包简化向.NET Core的迁移,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。从.NET迁移到.NET Core的一个主要原因,在于后者...
    99+
    2023-06-19
  • 如何通过JavaScript实现组件化和模块化
    今天小编给大家分享的是如何通过JavaScript实现组件化和模块化,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。组件化和模块化为什么会有组件化和模块化?当我们的项目复杂度不断上升,...
    99+
    2023-07-06
  • 如何通过Canvas+JS实现简易的时钟
    今天就跟大家聊聊有关如何通过Canvas+JS实现简易的时钟,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。之前学习了下html5中的canvas元素,为了练练手就实现了一个简易的时钟...
    99+
    2023-06-17
  • SoLid如何通过让公民控制自己的数据简化政府流程
    SoLid如何通过让公民控制自己的数据简化政府流程,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。SoLiD 是一个令人兴奋的新项目,由万维网发明者 Tim Berners-...
    99+
    2023-06-19
  • ASP.NET Core通过Microsoft.AspNetCore.App元包简化程序集引用
    Asp.net core下提供默认提供了一些在.net core不能直接使用的库,如日志、依赖注入、选项、通用主机、EntityFramework等,虽然我们可以通过Nuget的方式...
    99+
    2024-04-02
  • Linux下如何通过修改MTU优化cpu
    这篇文章主要介绍了Linux下如何通过修改MTU优化cpu,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。MTU:是网络的最大传输单元,通信术语:最大传输单元(Maximum ...
    99+
    2023-06-27
  • 如何通过php函数来优化网络通信效率?
    网络通信在现代应用程序开发中起着非常重要的作用,尤其是在Web应用程序中。在PHP编程中,我们可以使用一些优化技巧和函数来提高网络通信效率,以提升用户体验和应用性能。本文将介绍一些常用的PHP函数和技巧,旨在帮助开发人员优化网络通信。一、使...
    99+
    2023-10-21
    网络通信 PHP函数 优化效率
  • 如何通过构造函数实例化对象
    这篇文章主要介绍如何通过构造函数实例化对象,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!如下所示: @Data public class Person ...
    99+
    2024-04-02
  • 如何通过Java监听MySQL数据的变化
    目录原理开启MySQL的binlog功能Java监听MySQL的binlog实现监听数据变化总结原理 原理:java通过bin-log监控mysql数据变化 binlog :binl...
    99+
    2023-03-14
    java监听mysql数据表变化 java监听数据库变化 监听mysql数据变化
  • 如何通过Git API优化PHP开发流程?
    Git是一款非常流行的分布式版本控制工具,它能够有效地协助我们管理代码,协作开发,以及进行版本控制。与此同时,Git API也提供了丰富的功能来帮助我们优化PHP开发流程。本文将介绍如何通过Git API来优化PHP开发流程,以及如何在PH...
    99+
    2023-08-14
    开发技术 git api
  • 如何通过Java容器优化编程算法?
    Java是一种高级编程语言,广泛应用于各种计算机程序设计。编写高效的Java算法是每个Java程序员的必修课程之一。Java容器是Java编程中常用的一种数据结构,它能够提供快速的数据访问和高效的算法实现。在本文中,我们将介绍如何通过Jav...
    99+
    2023-07-10
    编程算法 容器 数据类型
  • Oracle数据库如何通过ODBC优化查询
    要通过ODBC优化查询Oracle数据库,可以采取以下几种方法: 使用索引:在数据库中创建适当的索引,可以加快查询速度。确保在查询中使用的列上有适当的索引。 使用参数绑定:在查询中使用参数绑定,而不是直接将参数值嵌入到查询语句中。这...
    99+
    2024-07-15
    oracle
  • c#.net+SQL2005如何实现简单搜索
    今天就跟大家聊聊有关c#.net+SQL2005如何实现简单搜索,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。搜索函数 USE [DATA...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作