【C#】异步的用法
1. C#5.0 加入了async, await关键字. async
是在声明异步方法时使用的修饰符, 声明放在返回值之前即可,await
表达式则负责消费异步操作, 不能出现在catch或finally块, 非异步匿名函数(没有用async声明的匿名方法或者lambda表达式), lock语句或不安全的代码中使用。
ps:这些约束条件是为了保证安全,特别是关于锁的约束。如果你希望在异步操作完成时持有锁,那么应该重新设计你的代码。不要通过在try/finally
块中手动调用Monitor.TryEnter
和Monitor.Exit
的方式绕过编译器的限制,而应该实现代码的更改,这样在操作过程中就不再需要锁了。如果此时的情况不允许代码的改变,则可考虑使用SemaphoreSlim
和它的WaitAsync
方法来代替。
2. 所有用async修饰的异步方法, 参数都不可以使用out 或者 ref 修饰符. 返回值必须是void, task, task<T>. 一般为task. 因为可以让调用者监控异步操作的状态.
3. await的主要目的是在等待耗时操作完成时避免阻塞。代码总是在执行到await的时候就开始返回了, 并且到达await之后会校验结果是否存在 如果结果不存在, 会安排给一个后续操作, 这个后续操作会记录位置,状态, 然后代码回到UI主线程继续运行, 此时button.click方法实际上已经执行结束. 现在的调用栈就是windows form的事件循环, 当await标记的结果得到时会继续运行之后的代码.
下面是我写的一个demo小测试程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Net.Http;
using System.Net;
using System.Diagnostics;
using System.IO; namespace DennisDemos.Demos
{
class AsyncDemo
{
public void Run()
{
//var result = Test1();
//Console.WriteLine(result.Result);// 必须等到结果之后才能继续执行下面的代码. 所以result是同步的.
//Console.WriteLine("test1 end");
Console.WriteLine("MainAsync start.");
var result2 = MainAsync(); Console.WriteLine("MainAsync end.");
while (!result2.IsCompleted)
{
Thread.Sleep();
Console.WriteLine("waiting..");
}
Console.WriteLine("end.");
}
static async Task MainAsync()
{
Task<string> task = ReadFileAsync("LogicDocument_DocAveLoadBalance.docx"); //❶ 开始异步读取
try
{
Console.WriteLine("start to wait reads file reult.");
string text = await task; //❷ 等待内容
Thread.Sleep();
Console.WriteLine("File contents");
}
catch (IOException e) //❸ 处理IO失败
{
Console.WriteLine("Caught IOException: {0}", e.Message);
}
} static async Task<string> ReadFileAsync(string filename)
{
Console.WriteLine("start to read file async.");
using (var reader = File.OpenText(filename)) //❹ 同步打开文件
{
var result = await reader.ReadToEndAsync();
Thread.Sleep();
Console.WriteLine("get read file async result.");
return result;
}
}
}
}
AsyncDemo
to be continued..
【C#】异步的用法的更多相关文章
- 【转】异步的AsyncHttpClient使用详解
http://blog.csdn.net/angjunqiang/article/details/55259170 背景 前面的一篇文章[同步的HttpClient使用详解]中,提到了服务端通进行网络 ...
- [.NET 4.5] ADO.NET / ASP.NET 使用 Async 和 Await 异步 存取数据库
此为文章备份,原文出处(我的网站) [.NET 4.5] ADO.NET / ASP.NET 使用 Async 和 Await 异步 存取数据库 http://www.dotblogs.com.tw ...
- java 多线程 一个博客
http://blog.csdn.net/a352193394/article/category/2563875 Java多线程之~~~线程安全容器的非阻塞容器 在并发编程中,会经常遇到使用容器.但是 ...
- Asp.Net Core微服务再体验
ASP.Net Core的基本配置 .在VS中调试的时候有很多修改Web应用运行端口的方法.但是在开发.调试微服务应用的时候可能需要同时在不同端口上开启多个服务器的实例,因此下面主要看看如何通过命令行 ...
- Asp.Net Core微服务初体验
ASP.Net Core的基本配置 .在VS中调试的时候有很多修改Web应用运行端口的方法.但是在开发.调试微服务应用的时候可能需要同时在不同端口上开启多个服务器的实例,因此下面主要看看如何通过命令行 ...
- node编写定时任务,for循环只执行一遍的解决办法
在用node编写定时任务时候,发现for循环只执行i=0这一次,就不接着循环执行了,下面贴上代码: exports.task = async function(ctx){ let { app } = ...
- (5)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- 熔断降级(Polly)
一. 什么是熔断降级 熔断就是“保险丝”.当出现某些状况时,切断服务,从而防止应用程序不断地尝试执行可能会失败的操作给系统造成“雪崩”,或者大量的超时等待导致系统卡死. 降级的目的是当某个服务提供者发 ...
- (5).NET CORE微服务 Micro-Service ---- 熔断降级(Polly)
一. 什么是熔断降级 熔断就是“保险丝”.当出现某些状况时,切断服务,从而防止应用程序不断地尝试执行可能会失败的操作给系统造成“雪崩”,或者大量的超时等待导致系统卡死. 降级的目的是当某个服务提供者发 ...
- Nodejs单元测试小结
前言 最近在写一课程的Project,用Node写了一个实时聊天小应用,其中就用到了单元测试.在写Node单元测试的时候,一方面感受到了单元测试的重要性,另一方面感受到了Node单元测试的不够成熟,尚 ...
随机推荐
- mysql运用now(3)存储时间到毫秒
) from DUAL;
- 【Redis学习之十一】Java客户端实现redis集群操作
客户端:jedis-2.7.2.jar 配置文件两种方式: properties: redis.cluster.nodes1=192.168.1.117 redis.cluster.port1=700 ...
- sqlmap的使用
安全测试===sqlmap(壹)转载 六.优化 这些参数可以优化Sqlmap的性能. 1.一键优化 参数:-o 添加此参数相当于同时添加下列三个优化参数: --keep-alive --null- ...
- linux下安装mysql(rpm文件安装)
数据库包下载: https://www.mysql.com/downloads/ 在GPL开原协议的社区开源版里边下载 我们用mysql community server里边的 其中workbench ...
- HDU 1232 畅通工程 (并查集)
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...
- Python+OpenCV图像处理(十一)—— 图像金字塔
简介:图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构.简单来说,图像金字塔就是用来进行图像缩放的. 进行图像缩放可以用图像金字塔,也可以使用 ...
- struts2 + spring + mybatis 框架整合详细介绍
struts2 + spring + mybatis 框架整合详细介绍 参考地址: https://blog.csdn.net/qq_22028771/article/details/5149898 ...
- awk中截取IP字段
由于文本的特殊性,IP字段可能并不是在特定的字段中. 借助awk的match()函数进行匹配截取 awk --re-interval '($0 ~ "xxx"){match($0, ...
- linux时间修改-hwclock和date
修改系统时间date 设定日期:date -s 月/日/年,例如设定日期为2018年12月1日,date -s 12/01/2018(年也可以是两位) 设定时间:date -s hh:mm:ss,例如 ...
- Angular 请求数据
Angular 请求数据 get post 以及 jsonp 请求数据 引入 HttpModule .JsonpModule 普通的 HTTP 调用并不需要用到 JsonpModule,不过稍后我们就 ...