15.3.1 声明异步方法和返回类型

         async static void GetStringAsync()
{
using (var client = new HttpClient())
{
Task<string> task = client.GetStringAsync("https://www.baidu.com/");
string result = await task;
}
}

15.3.3 可等待模式

  大量工作都是通过模式来表示的,这有点类似于 foreach 和LINQ查询。为了更清晰地描述
该模式的轮廓,假设存在一些相关的接口(但实际并没有)。稍后我会介绍真实情况,现在先来
看看虚构的接口:

     /// <summary> 为包含返回值的异步操作 建立的虚拟的接口  警告:这些并不存在 自定义的</summary>
public interface IAwaitable<T>
{
IAwaiter<T> GetAwaiter();
} public interface IAwaiter<T> : INotifyCompletion
{
bool IsCompleted { get; }
T GetResult(); //从INotifyCompletion 继承
//void OnCompleted(Action continuation);
} /// <summary> 为没有返回值的异步操作 建立的虚拟的接口 </summary>
public interface IAwaitable
{
IAwaiter GEtAwaiter();
} public interface IAwaiter : INotifyCompletion
{
bool IsCompleted { get; }
void GetResult(); //从INotifyCompletion 继承
//void OnCompleted(Action continuation);
}

  前面讲述了什么样的表达式可以作为 await 关键字的目标,不过整个表达式本身也同样拥有
一个有趣的类型:如果 GetResult() 返回 void ,那么整个 await 表达式就没有类型,而只是一
个独立的语句。否则,其类型与 GetResult() 的返回类型相同。
  例如, Task<TResult>.GetAwaiter() 返回一个 TaskAwaiter<TResult> ,其 GetResult()
方法返回 TResult 。(希望你不会感到奇怪。)根据 await 表达式的类型规则,我们可以编写这样
的代码:

             using (var client = new HttpClient())
{
Task<string> task = client.GetStringAsync("https://www.baidu.com/");
string result = await task;
}

  这里的 await 表达式不会返回任何类型的值,因此不能将其分配给变量,或作为方法实参进
行传递,也不能执行其他任何将表达式作为值的相关操作。
  需要注意的是,由于 Task 和 Task<TResult> 都实现了可等待模式,因此可以在一个异步方
法内调用另一个异步方法:

         public async Task<int> Foo()
{
string bar = await BarAsync();
//显然通常会更复杂
return bar.Length;
}
public async Task<string > BarAsync()
{
//一些异步代码,可能会调用更多异步方法
}

  组合异步操作正是异步特性大放异彩的一个方面。进入异步模式(mode)后,就可以很轻
松地保持这种模式,编写自然流畅的代码。

15.3 Task 语法和语义的更多相关文章

  1. C++ 的二进制语法与语义

    /* 转载请注明出处:http://www.cnblogs.com/Martinium/p/binary_literal.html */ 二进制的语法 C/C++ 默认数字使用十进制,八进制使用前缀 ...

  2. assertion的语法和语义

    .1) 语法表示 在语法上,为了支持assertion,Java增加了一个关键字assert.它包括两种表达式,分别如下: assert expression1; assert expression1 ...

  3. javaweb基础(15)_jsp基础语法

    任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语法,而且在JSP中,所有的JAVA语句都可以使用. 一.JSP模版元素 JSP页面中的HTML内容称之 ...

  4. 15.3 Task 异常

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

  5. 解读HTML 5新语法 提高语义价值

    HTML 5的新标记 设计者们需要完成的任务是要给HTML 5开发一个更丰富的和更有含义的语义,当然可以想象这种新方案将会是很灵活和很高效的,同时与所有的现代互联网标准相适应.下面就是一些将要在HTM ...

  6. Eigen与Matlab语法及语义辞典

    Eigen为Matlab转换为C++提供了一个简单的语法级别的代码迁移工具. 对一些代码进行了扩充,以便程序由Matlab到Eigen的移植................... 参考链接:http: ...

  7. 15.3 Task Task.Yield和Task.Delay说明

    https://blog.csdn.net/hurrycxd/article/details/79827958 书上看到一个Task.Yield例子,Task.Yield方法创建一个立即返回的awai ...

  8. 15.4 Task 异步匿名函数

    Func<int, Task<int>> func = async x => { Console.WriteLine("starting x={0}" ...

  9. HTML5经典实例——1基础语法和语义

    1指定DOCTYPE 在页面的最开始处指定HTML5 DOCTYPE DOCTYPE是不区分大小写的.可以任意的使用大小写. <!DOCTYPE html> <html lang=& ...

随机推荐

  1. poj 3461 字符串单串匹配--KMP或者字符串HASH

    http://poj.org/problem?id=3461 先来一发KMP算法: #include <cstdio> #include <cstring> #include ...

  2. 《Pro Android Graphics》读书笔记之第二节

    Android Digital Video: Formats, Concepts and Optimization Android Digital Video Formats: MPEG4 H.264 ...

  3. 倒排索引PForDelta压缩算法——基本假设和霍夫曼压缩同

    PForDelta算法 PForDelta算法最早由Heman在2005年提出,它允许同时对整个chunk数据(例128个数)进行压缩处理.基础思想是对于一个chunk的数列(例128个),认为其中占 ...

  4. hdu 2988(最小生成树 kruskal算法)

    Dark roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. hihocoder 1676 树上等差数列 黑科技树形dp

    #1676 : 树上的等差数列 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵包含N个节点的无根树,节点编号1~N.其中每个节点都具有一个权值,第i个节点的权值 ...

  6. WingIDE4.1 破解及支持中文设置

    1.下面提供最新版本的破解方法. 先到http://wingware.com/downloads/wingide下载最新版本的IDE. 安装之前,先修改时间到一个月前. 安装 安装之后然后获取试用版的 ...

  7. PCB SQL MS 将多行有序数据转为一行数据(一列转一行)

    一.原数据:多行有序 SELECT CC.techname FROM PPEflow BB LEFT JOIN pubgyxxb CC ON BB.techno = CC.techno ORDER B ...

  8. Python 32 通信循环 连接循环 粘包问题

    一:通信循环 二:连接循环 三:粘包问题

  9. MYSQL日期时间字符串互转

    --MYSQL date_format(date,'%Y-%m-%d') -------------->oracle中的to_char(); 日期时间转字符串 --MYSQL str_to_da ...

  10. # Nginx设置浏览器缓存

    配置语法 在location或if段里,来写. 格式 expires 30s; expires 30m; expires 2h; expires 30d; (注意:服务器的日期要准确,如果服务器的日期 ...