.Net通过TaskFactory.FromAsync简化APM
异步执行 I/O 密集型操作是生产高响应和可伸缩应用程序及组件的关键。可让您使用极少量的线程来执行大量的工作,而无需阻止任何线程。然而异步编程却有些麻烦,许多程序员不愿意去做它。
【.Net通过TaskFactory.FromAsync简化APM】网上有不少通过lambda 表达式和AsyncEnumerator 等来实现简化异步编程的方法,这些方法也确实行之有效,但在.net 4.0中,我们又多了一种选择——通过TaskFactory.FromAsync简化APM。
TaskFactory.FromAsync这个方法非常简单,通过它可以把一个异步的任务转换为一个Task,首先我们来看一个简单的例子吧:
static IEnumerableCopyStreamAsync(Stream input, Stream output){var buffer = new byte[0x2000]; while (true){var readTask = Task .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, IEnumerableasyncIterator){var scheduler = factory.Scheduler ?? TaskScheduler.Current; // Get an enumerator from the enumerablevar 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
这个函数我是摘录自ParallelProgrammingSamples中的,里面还有好几种其它的调用形式,可以根据需要选择合适的方法。
到此这篇关于.Net通过TaskFactory.FromAsync简化APM的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
推荐阅读
- .Net使用Cancellation|.Net使用Cancellation Framework取消并行任务
- c# , .net 后端判断是否是移动端,是否是安卓设备,是否是微信,是否是支付宝,是否是QQ,是否是安卓系统,是否是苹果系统等
- C#/VB.NET 将PDF转为SVG/Image, SVG/Image转PDF
- .NetCore实现图片缩放与裁剪|.NetCore实现图片缩放与裁剪 - 基于ImageSharp
- 龙芯发布|龙芯发布 .NET 6 SDK 6.0.105-ea1 LoongArch64 版本
- .NET|.NET Core企业微信开发接口回调配置
- 解决.NET|解决.NET Core企业微信openapi回调地址请求不通过的问题
- 使用C#如何连接到ACCESS数据库
- ADO.NET|C#数据库教程7-ADO.NET三层架构和数据库DBNull问题
- C#|C#数据库教程1-使用ADO.NET操作sql server 2012