C#异步编程学习笔记之-async和await(续)
书接上文,本篇主要记录的内容要点:
1、针对async和await在实际应用中的使用方式;
2、异步方法返回值(有返回值和无返回值)的两种情况;
示例一(无返回值):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.Text.RegularExpressions;
using System.Web;
using System.Threading.Tasks;
using System.Threading; namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "--主方法开始执行");
TestAsync();
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "--主方法执行完毕!");
Console.ReadKey();
} static async void TestAsync()
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "TestAsync方法开始");
await MyMethod();
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "TestAsync方法结束");
} //模拟耗时操作
//重要说明:如果异步方法未使用await运算符标记暂停点,那么异步方法会作为同步方法执行,
//即使有async修饰符,也不例外。
static async Task MyMethod()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "异步执行" + i.ToString() + "..");
await Task.Delay(1000); //模拟耗时操作
//Thread.Sleep(1000); //不能用
}
}
}
}
运行结果:
重要说明:如果异步方法未使用await运算符标记暂停点,那么异步方法会作为同步方法执行,即使有async修饰符,也不例外,结果如下:
示例二(有返回值):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.Text.RegularExpressions;
using System.Web;
using System.Threading.Tasks;
using System.Threading; namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "--主方法开始执行");
Task<string> result = TestAsync(); //如果此时用result.Result 获取异步结果,那么主线程将阻塞,等待异步线程返回结果后才继续执行
//Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "--子任务返回结果:" + result.Result); Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "--主方法执行完毕!");
Console.ReadKey();
} static async Task<string> TestAsync()
{
string strRet = string.Empty;
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "TestAsync方法开始");
//strRet = await Task.Run(() => Test()); //写法一
strRet = await Test(); //写法二
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "TestAsync方法结束,结果:" + strRet); return strRet;
} //模拟耗时操作
//重要说明:如果异步方法未使用await运算符标记暂停点,那么异步方法会作为同步方法执行,
//即使有async修饰符,也不例外。
static async Task<string> Test()
{
await Task.Delay(5000);
//Thread.Sleep(1000); //不能用
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "耗时任务执行。。。");
return "ok";
}
}
}
运行结果:
说明:
异步方法的返回值要在异步方法里获取,否则异步失效,如:
C#异步编程学习笔记之-async和await(续)的更多相关文章
- C#异步编程学习笔记之-async和await
一.异步方法介绍(async和await):如果使用async修饰符将某种方法指定为异步方法,即启用以下两种功能.1.标记的异步方法可以使用await来指定暂停点.await运算符通知编译器异步方法: ...
- ES6/7 异步编程学习笔记
前言 在ES6的异步函数出现之前,Js实现异步编程只有settimeout.事件监听.回调函数等几种方法 settTmeout 这种方法常用于定时器与动画的功能,因为其本质上其实是浏览器的WebAPI ...
- 多线程编程学习笔记——async和await(一)
接上文 多线程编程学习笔记——任务并行库(一) 接上文 多线程编程学习笔记——任务并行库(二) 接上文 多线程编程学习笔记——任务并行库(三) 接上文 多线程编程学习笔记——任务并行库(四) 通过前面 ...
- 多线程编程学习笔记——async和await(二)
接上文 多线程编程学习笔记——async和await(一) 三. 对连续的异步任务使用await操作符 本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步 ...
- 多线程编程学习笔记——async和await(三)
接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五. 处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...
- 多线程编程学习笔记——使用异步IO(一)
接上文 多线程编程学习笔记——使用并发集合(一) 接上文 多线程编程学习笔记——使用并发集合(二) 接上文 多线程编程学习笔记——使用并发集合(三) 假设以下场景,如果在客户端运行程序,最的事情之一是 ...
- 多线程编程学习笔记——异步调用WCF服务
接上文 多线程编程学习笔记——使用异步IO 接上文 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端 接上文 多线程编程学习笔记——异步操作数据库 本示例描述了如何创建一个WCF服务,并宿主 ...
- 多线程编程学习笔记——使用异步IO
接上文 多线程编程学习笔记——使用并发集合(一) 接上文 多线程编程学习笔记——使用并发集合(二) 接上文 多线程编程学习笔记——使用并发集合(三) 假设以下场景,如果在客户端运行程序,最的事情之一是 ...
- 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端
接上文 多线程编程学习笔记——使用异步IO 二. 编写一个异步的HTTP服务器和客户端 本节展示了如何编写一个简单的异步HTTP服务器. 1.程序代码如下. using System; using ...
随机推荐
- dev exception 2018
java.lang.IllegalArgumentException: Circular placeholder reference 'trace.enable' in property defini ...
- mysql的启动问题
用cmd启动MySQL (net start mysql )时出现(发生系统错误 5. 拒绝访问)这样的错误是因为cmd 权限太低了需要提高cmd权限才行(即使管理员权限) 如下图cmd所示: ...
- Hander创建消息
每一个消息都需要被指定的Handler处理,通过Handler创建消息便可以完成此功能.Android消息机制中引入了消息池.Handler创建消息时首先查询消息池中是否有消息存在,如果有直接从消息池 ...
- python之scrapy携带Cookies模拟登陆
知识点 """ scrapy两种模拟登陆: 1.直接携带cookie 2.找到发送post请求的url地址,带上信息,发送请求 应用场景: 1.cookie过期时间很长, ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-4.在线教育后台数据库设计
笔记 4.在线教育后台数据库设计 简介:讲解后端数据库设计 ,字段冗余的好处,及常见注意事项 1.数据库设计: er图: 实体对象:矩形 ...
- 一百一十七:CMS系统之注册页面对接短信验证码
from flask import Blueprint, requestfrom exts import alidayufrom utils import restfulfrom utils.capt ...
- ActionScript的for循环
actionscript支持的for循环有三种形式: 1.for(初始值;条件;递增) 例如: for(var x:int=1;x<=10;x++) trace(x); trace()会把结果输 ...
- linux 系统函数 basename和dirname
在linux系统中有这样两个系统函数,basename 和 dirname 1.basename 用于 获取文件名, 1.1 当给定扩展名作为参数之后,甚至可以直接获取文件名 2.与basename ...
- 【CSS】如何在一个页面中引入样式css
CSS(Cascading Style Sheet)又叫层叠样式表.是我们学习前端必不可少的一门语言,学习它其实就是为了学会如何去更改页面标签的样式.目前使用最广的是css3,但同样的,他是从css2 ...
- pig-csm 7.9修改记录
PigCms\Lib\Action\System\UsersAction.class.php 存在页面广告跳转 bbs.go _pe.cn的问题 tpl\Home\weimob\public_head ...