我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

这篇文章主要介绍“.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”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

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

PHP8中如何通过Constructor Property Promotion简化类的构造函数?

PHP8中如何通过Constructor Property Promotion简化类的构造函数?在PHP8中,引入了Constructor Property Promotion(构造函数属性推广)特性,这使得编写类的构造函数更加简洁和高效。
2023-10-22

如何使用go net实现简单的redis通信协议

这篇文章主要为大家展示了“如何使用go net实现简单的redis通信协议”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用go net实现简单的redis通信协议”这篇文章吧。 图解red
2023-06-21

如何使用Windows兼容包简化向.NET Core的迁移

今天就跟大家聊聊有关如何使用Windows兼容包简化向.NET Core的迁移,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。从.NET迁移到.NET Core的一个主要原因,在于后者
2023-06-19

如何通过Canvas+JS实现简易的时钟

今天就跟大家聊聊有关如何通过Canvas+JS实现简易的时钟,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。之前学习了下html5中的canvas元素,为了练练手就实现了一个简易的时钟
2023-06-17

如何通过JavaScript实现组件化和模块化

今天小编给大家分享的是如何通过JavaScript实现组件化和模块化,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。组件化和模块化为什么会有组件化和模块化?当我们的项目复杂度不断上升,
2023-07-06

SoLid如何通过让公民控制自己的数据简化政府流程

SoLid如何通过让公民控制自己的数据简化政府流程,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。SoLiD 是一个令人兴奋的新项目,由万维网发明者 Tim Berners-
2023-06-19

Linux下如何通过修改MTU优化cpu

这篇文章主要介绍了Linux下如何通过修改MTU优化cpu,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。MTU:是网络的最大传输单元,通信术语:最大传输单元(Maximum
2023-06-27

如何通过php函数来优化网络通信效率?

网络通信在现代应用程序开发中起着非常重要的作用,尤其是在Web应用程序中。在PHP编程中,我们可以使用一些优化技巧和函数来提高网络通信效率,以提升用户体验和应用性能。本文将介绍一些常用的PHP函数和技巧,旨在帮助开发人员优化网络通信。一、使
2023-10-21

如何通过Java监听MySQL数据的变化

对于二次开发来说,很大一部分就找找文件和找数据库的变化情况,下面这篇文章主要给大家介绍了关于如何通过Java监听MySQL数据的变化的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2023-03-14

如何通过Office模板轻松快捷创建简历

  通过使用Office模板还可以轻松快捷地创建简历,我怎么不知道呢?其实大家在Office官方网站上就可以看到网站上提供了很多丰富的可供免费使用的简历模板,我们通过word2010便可轻松快速地从中搜索并下载自己需要的模板,进而制作出属于自己的精美简历啦。事不宜迟,我们马上来看一下具体的创建过程吧!  首先我们来看一
如何通过Office模板轻松快捷创建简历
2024-04-17

Oracle数据库如何通过ODBC优化查询

要通过ODBC优化查询Oracle数据库,可以采取以下几种方法:使用索引:在数据库中创建适当的索引,可以加快查询速度。确保在查询中使用的列上有适当的索引。使用参数绑定:在查询中使用参数绑定,而不是直接将参数值嵌入到查询语句中。这样可以减少S
Oracle数据库如何通过ODBC优化查询
2024-07-15

如何通过C语言编写一个简单的游戏

本篇内容主要讲解“如何通过C语言编写一个简单的游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何通过C语言编写一个简单的游戏”吧!去取一个随机数从写一个函数来选择一个随机数字来开始“猜数字”
2023-06-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录