返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >.Net通过TaskFactory.FromAsync简化APM
  • 511
分享到

.Net通过TaskFactory.FromAsync简化APM

2024-04-02 19:04:59 511人浏览 安东尼
摘要

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

异步执行 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/151775.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
  • 通过VB .NET打开SQL数据库
    在VB .NET中,可以使用System.Data.SqlClient命名空间来打开和操作SQL数据库。以下是一个简单的示例代码,演...
    99+
    2023-09-07
    SQL数据库
  • ASP.NET Core通过Microsoft.AspNetCore.App元包简化程序集引用
    Asp.net core下提供默认提供了一些在.net core不能直接使用的库,如日志、依赖注入、选项、通用主机、EntityFramework等,虽然我们可以通过Nuget的方式...
    99+
    2024-04-02
  • 怎么通过Docker在Linux上托管.NET Core
    这篇文章主要为大家分析了怎么通过Docker在Linux上托管.NET Core的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“怎么通过Docker在Linu...
    99+
    2023-06-28
  • .net程序通过crontab无法启动怎么办
    这篇文章主要介绍“.net程序通过crontab无法启动怎么办”,在日常操作中,相信很多人在.net程序通过crontab无法启动怎么办问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”.net程序通过cront...
    99+
    2023-06-22
  • 教你30分钟通过Kong实现.NET网关
    什么是Kong Openrestry是一个基于Nginx与Lua的高性能平台,内部有大量的Lua库。其中ngx_lua_moudule使开发人员能使用Lua脚本调用Nginx模块。K...
    99+
    2024-04-02
  • PHP8中如何通过Constructor Property Promotion简化类的构造函数?
    PHP8中如何通过Constructor Property Promotion简化类的构造函数?在PHP8中,引入了Constructor Property Promotion(构造函数属性推广)特性,这使得编写类的构造函数更加简洁和高效。...
    99+
    2023-10-22
    PHP constructor Property Promotion
  • 通过数据结构实现简易通讯录
    AddressBookTest是测试类package MyADB;import java.util.InputMismatchException;import java.util.Scanner;class InstructionsMist...
    99+
    2023-06-02
  • KB5027301 简化了 Beta 通道的通知控制
    是时候再次谈论 Windows 11 了,所以如果你是一个爱好者,你肯定来对地方了,了解一些新闻。为什么?好吧,因为Microsoft刚刚将内部版本 22621.1900 和内部版本 22631.1900 (KB5027301) 发布到 W...
    99+
    2023-07-10
  • Python 和 Linux:如何通过加载数据类型来简化编程?
    Python 和 Linux 都是非常流行的开发平台,两者的结合可以实现非常强大的功能。其中,Python 作为一种高级编程语言,具有很多优势,如易读性、简洁性和灵活性等。而 Linux 则是一种广泛使用的操作系统,其优势在于其开放性和可...
    99+
    2023-07-04
    linux 数据类型 load
  • .net 通过 WebAPI 调用nsfwjs 进行视频鉴别功能
    1. npm 安装 nsfwjs npm install express --save npm install multer --save npm install jpeg-js...
    99+
    2024-04-02
  • 怎么通过Chocolatey软件包管理器安装.NET Core
    本篇内容主要讲解“怎么通过Chocolatey软件包管理器安装.NET Core”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么通过Chocolatey软件包管理器安装.NET Core”吧!...
    99+
    2023-06-19
  • .NET Core通过dotnet publish命令发布应用的方法
    这篇文章主要介绍“.NET Core通过dotnet publish命令发布应用的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“.NET Core通过dotnet&...
    99+
    2023-06-29
  • 如何使用go net实现简单的redis通信协议
    这篇文章主要为大家展示了“如何使用go net实现简单的redis通信协议”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用go net实现简单的redis通信协议”这篇...
    99+
    2023-06-21
  • 通过CartPole游戏详解PPO 优化过程
    目录CartPole 介绍超参数设置模型定义游戏初始化保存未训练时的运动情况模型训练保存训练后的运动情况CartPole 介绍 在一个光滑的轨道上有个推车,杆子垂直微置在推车上,随...
    99+
    2023-05-15
    CartPole PPO游戏优化 CartPole PPO
  • 利用 Node.js Socket.IO 简化实时通信
    Socket.IO 是一个强大的 Node.js 库,用于在客户端和服务器之间建立实时双向通信通道。它使用 WebSockets 作为底层传输协议,提供了一个统一的 API 来处理各种通信模式,例如事件发射、消息传递和在线状态。在本文中,...
    99+
    2024-04-02
  • 如何使用Windows兼容包简化向.NET Core的迁移
    今天就跟大家聊聊有关如何使用Windows兼容包简化向.NET Core的迁移,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。从.NET迁移到.NET Core的一个主要原因,在于后者...
    99+
    2023-06-19
  • 通过简单脚本实现MYSQL的起停
    本文主要给大家介绍通过简单脚本实现MYSQL的起停,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下通过简单脚本实现MYSQL的起停吧。对于多insta...
    99+
    2024-04-02
  • oraclet通过DBMS_SQLTUNE.EXECUTE_TUNING_TASK获取优化建议
    DBMS_SQLTUNE.EXECUTE_TUNING_TASK1 通过取得来自cursor cache 的sql_id来指定sql语句来建立任务2 sql调优的集合包括的多个语句来建立任务3 单一sql语...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作