Func<int, Task<int>> func = async x =>
{
Console.WriteLine("starting x={0}", x);
await Task.Delay(x);
Console.WriteLine("ending x={0}", x);
return x * ;
}; Task<int> first1 = func();
Task<int> first2 = func();
Console.WriteLine("first1 result = {0}", first1.Result);
Console.WriteLine("first2 result = {0}", first2.Result);
/* starting x=5
starting x=3
ending x=3
ending x=5
first1 result = 10
first2 result = 6 */

此处我故意选择这样的值,以便让第二个操作早于第一个完成。但由于我们要在等待第一个 操作完成后再打印结果(使用 Result 属性,这将阻塞线程直到任务结束。再次强调一遍,运行 这样的代码时要十分谨慎!)

将异步代码放到异步方法中,也可得到同样的结果。 异步匿名函数并不会让我感到特别兴奋,但它也有自己的用途。尽管不能应用于LINQ查询 表达式,但在某些情况下,还是可以实现数据转换的异步执行的。这时,只需以一种略微不同的 方式思考整个过程即可。 在讨论完成分后,我们还会回到这个话题,但首先我想向大家展示一下异步匿名函数特别有 用的一个方面。我之前承诺过,要展示另一种在异步方法开始时及早执行参数验证的方式。你可 能还记得,在进入主操作前,需检查参数值是否为空。代码清单15-10是一个单个方法,其结果 与代码清单15-6中两个分离方法得到的结果完全相同。

         static Task<int> ComputeLengthAsync(string text)
{
if (text == null)
{
throw new ArgumentNullException("text");
}
Func<Task<int>> func = async () =>
{
await Task.Delay();
return text.Length;
};
return func();
}

  你会发现这并不是一个异步方法。如果是的话,异常会被包装到任务里,而不是立即抛出。 但我们还是想返回一个任务,因此在验证 之后,将工作包装到一个异步匿名函数中 ,调用委 托 并返回结果。 尽管这看上去还是有点丑,但比分割成两个方法要清晰多了。不过性能上会蒙受一点损失: 额外的包装会产生额外的代价。这在大多数情况下都没有问题,但如果你编写的库会应用于注重 性能的程序,则应在真实场景中检测成本,然后再决定使用哪种方法。

15.4 Task 异步匿名函数的更多相关文章

  1. 15.3 Task 异常

    1. 在等待时拆包异常 在等待任务时,任务出错或取消都将抛出异常,但并不是 AggregateException .大多情 况下为方便起见,抛出的是 AggregateException 中的第一个异 ...

  2. C++11 带来的新特性 (4)—— 匿名函数(Lambdas)

    1 语法 Lambdas并不是新概念,在其它语言中已经烂大街了.直接进入主题,先看语法: [ captures ] ( params ) specifiers exception attr -> ...

  3. python----内置函数2与匿名函数

    1.迭代器生成器相关 range:创建一个可迭代对象,一般与for混合使用,可设置步长. for i in range(0,10,2): #步长2范围为0-10不包括10 print(i) # 0 2 ...

  4. Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历

    Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历 https://www.cnblogs.com/shuxiaolong/p/DotNet_Task_BUG.html 异步Task简单 ...

  5. 『审慎』.Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历

    异步Task简单介绍 本标题有点 哗众取宠,各位都别介意(不排除个人技术能力问题) —— 接下来:我将会用一个小Demo 把 本文思想阐述清楚. .Net 4.0 就有了 Task 函数 —— 异步编 ...

  6. python 基础篇 15 内置函数和匿名函数

    ------------------------>>>>>>>>>>>>>>>内置函数<<< ...

  7. 自己动手写个异步IO函数 --(基于 c# Task)

    前言    对于服务端,达到高性能.高扩展离不开异步.对于客户端,函数执行时间是1毫秒还是100毫秒差别不大,没必要为这一点点时间煞费苦心.对于异步,好多人还有误解,如: 异步就是多线程:异步就是如何 ...

  8. javascript 利用匿名函数对象给你异步回调方法传参数

    先来创建一个匿名函数对象: /*** * 匿名函数 */ var callChangeBtn=new function(bugBtn){ this.chage=function(json){ bugB ...

  9. day 15递归 匿名函数

    三元表达式 目的是简化书写 局限性:三元表达式智能简化仅有两个分支的if判断,而且这个判断无论是否成立都必须要返回值 res = True if age >=18 else False 递归: ...

随机推荐

  1. 机器学习1k近邻

    自己一直学习计算机视觉方面的东西,现在想学习一下数据挖掘跟搜索引擎,自己基础也有点薄弱,看朱明的那本数据挖掘,只能片面的了解这个数据挖掘.不过最近有一本书 机器学习实战,于是乎通过实战的形式了解一下基 ...

  2. SVN:通过命令行只提交目录,并忽略其中的文件

    通过SVN命令行,我们可以只提交项目的目录结构,从而绕开一开始就将我们不想要上传的文件给提交到服务器上.命令如下:svn add -N [directory] 之后可以进入此目录,执行以下命令:svn ...

  3. 输入法InputConnection

    /**  * The InputConnection interface is the communication channel from an  * {@link InputMethod} bac ...

  4. springmvc 中开发Server Send Event

    springmvc 中开发Server Send Event 学习了:http://blog.csdn.net/leiliz/article/details/55195203 https://www. ...

  5. C++ Development Library

    C/C++ 开发库 | C/C++ Development Library 这里收集一些著名的 C/C++ 开发库.SDK.类库.可复用类与结构代码 等信息,列举它们的介绍.参考和网站链接,为各位 C ...

  6. linux patch 命令小结【转】

    本文转载自:http://blog.csdn.net/wh_19910525/article/details/7515540 说到patch命令,就不得不提到diff命令,也就是制作patch的必要工 ...

  7. Android 的Recovery机制【转】

    本文转载自:http://blog.csdn.net/fengying765/article/details/38301895 Android 的Recovery机制 目录 1. 系统的启动模式 1 ...

  8. Winform设计-小百货 涵盖基础插件学习(适合新手)

    Winform设计-小百货 涵盖基础插件学习(适合新手)   第一次写winform,主要是为了加快对  事件的 理解. 代码如下: private void Form1_Load(object se ...

  9. 洛谷 P1081 开车旅行 —— 倍增

    题目:https://www.luogu.org/problemnew/show/P1081 真是倍增好题! 预处理:f[i][j] 表示从 i 点开始走 2^j 次 AB (A,B各走一次)到达的点 ...

  10. JDK5.0新特性(静态导入、自动装箱/拆箱、增强for循环、可变参数、枚举、泛形)

    JDK5中新增了很多新的java特性,利用这些新语法可以帮助开发人员编写出更加高效.清晰,安全的代码. 这些新特性主要有:1.静态导入2.自动装箱/拆箱3.增强for循环4.可变参数5.枚举6.泛型7 ...