回顾C#5.0是如何进行异步编程的

static void Main(string[] args)
{
string url = "https://docs.microsoft.com/zh-cn/dotnet/core/api/system";
Task task = WriteWebRequestSizeAsync(url);
var x = task.IsCompleted;
while (!task.Wait())
{
Console.Write(".");
} }
static async Task WriteWebRequestSizeAsync(string url)
{
try
{
WebRequest request = WebRequest.Create(url);
WebResponse response = await request.GetResponseAsync();
using (var reader = new StreamReader(response.GetResponseStream()))
{
string text = await reader.ReadToEndAsync();
Console.WriteLine(FormatBytes(text.Length));
}
}
catch (WebException)
{ }
//省略部分Catch块
}

这个代码在上一篇同步VS异步中也有的 http://www.cnblogs.com/cheesebar/p/6553310.html

上一篇着重记录了基于C#5.0之前是如何进行异步编程的,这里就在探讨一下async和await

首先去掉async

1.这里表明标记为 async 的方法为异步方法

2.await只能在异步方法中使用,并且await后面方法返回值必须为Task或者Task<Result>

现在去掉await(保留async)并把方法改为同步

1.这里表明单有async没有await操作符的方法将以同步方式运行(好吧是都写着呢)

问题:async标记的方法(并且使用了await),那么它总是异步执行的吗

实际上,在调用方法内部的异步操作之前,它总是以同步执行的,可以和TPL(Task Parallel Library)执行过程相比较,await只是提供了一个异步操作的流程控制,async就是告诉编译器,这里我将可能会有异步方法的同步调用(await后面必须为一个异步方法,但在await的上下文环境中,它是阻塞的)

没有await会怎么样

static void Main(string[] args)
{
var task = Async一天();
while (!task.Wait())
{
Console.Write("一天进行中...");
}
Console.WriteLine("一天结束了...");
}
static async Task Async一天()
{
Async七点();
Async八点();
Async十一点();
Async十八点();
}
static Task Async七点()
{
Task task = Task.Run(() =>
{
Console.WriteLine("七点起床...");
Thread.Sleep();
});
return task;
}
static Task Async八点()
{
Task task = Task.Run(() =>
{
Console.WriteLine("八点上班...");
Thread.Sleep();
});
return task;
}
static Task Async十一点()
{
Task task = Task.Run(() =>
{
Console.WriteLine("十一点吃午饭...");
Thread.Sleep();
});
return task;
}
static Task Async十八点()
{
Task task = Task.Run(() =>
{
Console.WriteLine("十八点吃晚饭...");
Thread.Sleep();
});
return task;
}

Ctrl+F5输出

await来控制异步方法的执行流程

修改一下Async一天方法

static async Task Async一天()
{
await Async七点();
await Async八点();
await Async十一点();
await Async十八点();
}

最新文章

  1. mediawiki安装
  2. Head First Html and CSS学习笔记之HTML
  3. sql server convert 日期
  4. Linux 硬盘分区
  5. PHP自定义函数格式化json数据怎么调用?
  6. sql工作问题总结
  7. 基于Struts2框架实现登录案例
  8. KMP模版
  9. DM6437 dsp系列之启动过程全析(2)—AIS文件解析
  10. Database Go and JSON
  11. Spring IOC容器分析(4) -- bean创建获取完整流程
  12. C++ 初始化列表(转)
  13. 老男孩python学习自修第十四天【序列化和json】
  14. Python自动化运维之pexpect从入门到精通
  15. 【BZOJ4555】求和(多种解法混合版本)
  16. Atitit 纯java项目的提升进度大法---通用json dsl接口
  17. C166-变量和函数指定物理地址之二
  18. Lftp 简单使用步骤
  19. [分布式系统学习] 6.824 LEC1 MapReduce 笔记
  20. range() 与 np.arange()

热门文章

  1. Python用pip安装IPython/Jupyter最佳交互环境
  2. Day4_装饰器
  3. Golang之Context的使用
  4. Vue、AngularJS 双向数据绑定解剖
  5. html标签分类
  6. SOFA 源码分析 —— 服务发布过程
  7. 解决iframe在移动端(主要iPhone)上的问题
  8. Java开源生鲜电商平台-商品表的设计(源码可下载)
  9. 面试真题--------spring源码解析IOC
  10. Java IO基础总结