书接上文,本篇主要记录的内容要点:
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(续)的更多相关文章

  1. C#异步编程学习笔记之-async和await

    一.异步方法介绍(async和await):如果使用async修饰符将某种方法指定为异步方法,即启用以下两种功能.1.标记的异步方法可以使用await来指定暂停点.await运算符通知编译器异步方法: ...

  2. ES6/7 异步编程学习笔记

    前言 在ES6的异步函数出现之前,Js实现异步编程只有settimeout.事件监听.回调函数等几种方法 settTmeout 这种方法常用于定时器与动画的功能,因为其本质上其实是浏览器的WebAPI ...

  3. 多线程编程学习笔记——async和await(一)

    接上文 多线程编程学习笔记——任务并行库(一) 接上文 多线程编程学习笔记——任务并行库(二) 接上文 多线程编程学习笔记——任务并行库(三) 接上文 多线程编程学习笔记——任务并行库(四) 通过前面 ...

  4. 多线程编程学习笔记——async和await(二)

    接上文 多线程编程学习笔记——async和await(一) 三.   对连续的异步任务使用await操作符 本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步 ...

  5. 多线程编程学习笔记——async和await(三)

    接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五.   处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...

  6. 多线程编程学习笔记——使用异步IO(一)

    接上文 多线程编程学习笔记——使用并发集合(一) 接上文 多线程编程学习笔记——使用并发集合(二) 接上文 多线程编程学习笔记——使用并发集合(三) 假设以下场景,如果在客户端运行程序,最的事情之一是 ...

  7. 多线程编程学习笔记——异步调用WCF服务

    接上文 多线程编程学习笔记——使用异步IO 接上文 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端 接上文 多线程编程学习笔记——异步操作数据库 本示例描述了如何创建一个WCF服务,并宿主 ...

  8. 多线程编程学习笔记——使用异步IO

    接上文 多线程编程学习笔记——使用并发集合(一) 接上文 多线程编程学习笔记——使用并发集合(二) 接上文 多线程编程学习笔记——使用并发集合(三) 假设以下场景,如果在客户端运行程序,最的事情之一是 ...

  9. 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端

    接上文 多线程编程学习笔记——使用异步IO 二.   编写一个异步的HTTP服务器和客户端 本节展示了如何编写一个简单的异步HTTP服务器. 1.程序代码如下. using System; using ...

随机推荐

  1. dev exception 2018

    java.lang.IllegalArgumentException: Circular placeholder reference 'trace.enable' in property defini ...

  2. mysql的启动问题

    用cmd启动MySQL   (net start mysql )时出现(发生系统错误 5.  拒绝访问)这样的错误是因为cmd 权限太低了需要提高cmd权限才行(即使管理员权限) 如下图cmd所示: ...

  3. Hander创建消息

    每一个消息都需要被指定的Handler处理,通过Handler创建消息便可以完成此功能.Android消息机制中引入了消息池.Handler创建消息时首先查询消息池中是否有消息存在,如果有直接从消息池 ...

  4. python之scrapy携带Cookies模拟登陆

    知识点 """ scrapy两种模拟登陆: 1.直接携带cookie 2.找到发送post请求的url地址,带上信息,发送请求 应用场景: 1.cookie过期时间很长, ...

  5. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-4.在线教育后台数据库设计

    笔记 4.在线教育后台数据库设计     简介:讲解后端数据库设计    ,字段冗余的好处,及常见注意事项 1.数据库设计:          er图:          实体对象:矩形        ...

  6. 一百一十七:CMS系统之注册页面对接短信验证码

    from flask import Blueprint, requestfrom exts import alidayufrom utils import restfulfrom utils.capt ...

  7. ActionScript的for循环

    actionscript支持的for循环有三种形式: 1.for(初始值;条件;递增) 例如: for(var x:int=1;x<=10;x++) trace(x); trace()会把结果输 ...

  8. linux 系统函数 basename和dirname

    在linux系统中有这样两个系统函数,basename 和  dirname 1.basename 用于 获取文件名, 1.1 当给定扩展名作为参数之后,甚至可以直接获取文件名 2.与basename ...

  9. 【CSS】如何在一个页面中引入样式css

    CSS(Cascading Style Sheet)又叫层叠样式表.是我们学习前端必不可少的一门语言,学习它其实就是为了学会如何去更改页面标签的样式.目前使用最广的是css3,但同样的,他是从css2 ...

  10. pig-csm 7.9修改记录

    PigCms\Lib\Action\System\UsersAction.class.php 存在页面广告跳转 bbs.go _pe.cn的问题 tpl\Home\weimob\public_head ...