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