15.3 Task 语法和语义
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 语法和语义的更多相关文章
- C++ 的二进制语法与语义
/* 转载请注明出处:http://www.cnblogs.com/Martinium/p/binary_literal.html */ 二进制的语法 C/C++ 默认数字使用十进制,八进制使用前缀 ...
- assertion的语法和语义
.1) 语法表示 在语法上,为了支持assertion,Java增加了一个关键字assert.它包括两种表达式,分别如下: assert expression1; assert expression1 ...
- javaweb基础(15)_jsp基础语法
任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语法,而且在JSP中,所有的JAVA语句都可以使用. 一.JSP模版元素 JSP页面中的HTML内容称之 ...
- 15.3 Task 异常
1. 在等待时拆包异常 在等待任务时,任务出错或取消都将抛出异常,但并不是 AggregateException .大多情 况下为方便起见,抛出的是 AggregateException 中的第一个异 ...
- 解读HTML 5新语法 提高语义价值
HTML 5的新标记 设计者们需要完成的任务是要给HTML 5开发一个更丰富的和更有含义的语义,当然可以想象这种新方案将会是很灵活和很高效的,同时与所有的现代互联网标准相适应.下面就是一些将要在HTM ...
- Eigen与Matlab语法及语义辞典
Eigen为Matlab转换为C++提供了一个简单的语法级别的代码迁移工具. 对一些代码进行了扩充,以便程序由Matlab到Eigen的移植................... 参考链接:http: ...
- 15.3 Task Task.Yield和Task.Delay说明
https://blog.csdn.net/hurrycxd/article/details/79827958 书上看到一个Task.Yield例子,Task.Yield方法创建一个立即返回的awai ...
- 15.4 Task 异步匿名函数
Func<int, Task<int>> func = async x => { Console.WriteLine("starting x={0}" ...
- HTML5经典实例——1基础语法和语义
1指定DOCTYPE 在页面的最开始处指定HTML5 DOCTYPE DOCTYPE是不区分大小写的.可以任意的使用大小写. <!DOCTYPE html> <html lang=& ...
随机推荐
- ZooKeeper的下载方法
1.进入官网: https://zookeeper.apache.org/releases.html 2.进入服务器列表: http://www.apache.org/dyn/closer.cgi/z ...
- Maven: java.lang.ClassNotFoundException: org.eclipse.aether.spi.connector.Transfer$State
在mac中使用maven compile时发生以下错误: Maven: java.lang.ClassNotFoundException: org.eclipse.aether.spi.connect ...
- CF #329 D
D题,LCA是很明显的.要注意的是,因为是除法,所以最多可以除x>2的有64次,当大于64时可以直接返回0.而且注意到可能会有很多值为1的边,可以使用路径压缩,把边为1的边压缩掉,类似于并查集的 ...
- 《从零開始学Swift》学习笔记(Day60)——Core Foundation框架
创文章,欢迎转载.转载请注明:关东升的博客 Core Foundation框架是苹果公司提供一套概念来源于Foundation框架,编程接口面向C语言风格的API.尽管在Swift中调用这样的C语 ...
- umask函数的使用方法 - 怎样进行权限位的设置
以下程序创建了两个文件,创建foo文件时,umask值为0,创建第二个时,umask值禁止全部组和其它用户的訪问权限. 測试结果: 測试结果能够看出更改进程的文件模式掩码并不影响其父进程(经常是she ...
- 【JavaScript】正則表達式
正則表達式,也不是第一次与它见面了.在我们学习ASP.NET视频的时候,验证控件的那个实例中.就有提到过它. 那个时候.都是在控件的属性中自己设置的,用的原理就是正則表達式,当时得感觉就是方便,强大, ...
- 数据结构(C实现)------- 顺序栈
栈是限定仅在表的一端进行插入或删除的纯属表,通常称同意插入.删除的一端为栈顶(Top),对应在的.则称还有一端为栈底(Bottom). 不含元素的栈则称为空栈. 所设栈S={a1,a2,a3,..., ...
- 一条SQL语句求每月连续低温时间
近期为某个项目写存储过程做统计.其中有个是这样的: 求每个月至少连续3个小时低于某个温度值的时间(小时). 假设有个全年温度表: CREATE TABLE #t(m INT, h INT ,t DEC ...
- vijos P1459车展
P1459车展 Accepted 标签:数据结构 平衡树数据结构 堆重游SC theme Park 描述 遥控车是在是太漂亮了,韵韵的好朋友都想来参观,所以游乐园决定举办m次车展.车库里共有n ...
- B1076 [SCOI2008]奖励关 状压dp&&期望dp
这个题的n<15,一看就是状压dp.但是状态不是很好想.f[][]存i关的状态j. 这个题另一个关键思想在于倒推,我一开始想的是正推,但是只能记忆化了. 题干: 题目描述 你正在玩你最喜欢的电子 ...