前面一篇文章,了解了任务并行库。这是异步编程基础设施,它允许我们以模块化的方式设计程序,来组合不同的异步操作。解决了以往线程之间传递消息难等问题,但是我们在阅读和编写此类程序时还是会觉得非常难理解程序的实际执行顺利,总感觉把主动权交给并行库,总觉得心里面没底。而且随着系统的不断扩大,业务的不断完善,了解程序的先后执行次序就变得很重要。

C#5.0

在C#5.0中,微软引入了一个全新的语言特性,异步函数。它是TPL之上的更高级别的抽象,真正简化了异步编程。

抽象隐藏了主要的实现细节,使得程序员无需考虑许多重要的事情,从而使异步编程更加容易。

        async Task<string> GetStringAsync()
{
await Task.Delay(TimeSpan.FromSeconds(2));
return "你好,阿辉";
}

一、async和await

  • 在async标识的方法体里面,如果没有await关键字出现,那么这种方法和调用普通的方法没什么区别。
  • 在async标识的方法体里面,在await关键字出现之前,还是主线程顺序调用执行,知道await关键字的出现才会出现线程阻塞。
  • await关键字可以理解为等待方法执行完毕,除了可以标记有async关键字的方法外还能标记Task对象,标识等待该线程执行完毕。所以await关键字并不针对于asyncd的方法,而是针对async方法所返回给我们的Task。
  • async方法的返回类型必须为void、Task或者Task类型,说白了,async要么是void,要么和Task关联。

在async方法外不能使用await关键字,否则编译错误。异步函数在代码中至少要拥有一个await操作符,如果没有,也不会报错,只是会提示警告。

在ASP.NET程序中,一旦在代码中使用了异步,最好一直使用。调用异步方法时,应该用await等待它返回Task对象,一定要避免使用Task.Wait或Task.Result方法,因为这两个方法会阻塞线程。

        public ActionResult DeadLock()
{
Task task = WaitAsync();
//同步程序块,正在等待异步方法完成
task.Wait();
return Content("执行完毕");
} async Task WaitAsync()
{
await Task.Delay(TimeSpan.FromSeconds(5));
}

在DeadLock()方法中,当执行到task.Wait()方法时,主线程会被阻塞,不往下执行。等候WaitAsync()异步方法执行完毕后,才解除阻塞。

在C#5.0中,await和Async是有一定的限制的。

  • 不能把控制台中的Main()方法标记为async.
  • 不能在catch、finally、lock或unsafe代码块中使用await操作符。
  • 不允许对任何异步函数使用ref或out参数。

并不是所有的方法都得上Async的,对于需要异步处理的该使用async/await就使用,不需要的就使用平常方法。平常的方法在性能方面要比async关键字方法块40~50倍。所以我们在平时也要注意不能滥用async。

二、使用await操作符获取异步任务结果

        async static Task WithWait()
{
try
{
string result = await GetInfoAsync("阿辉");
Console.WriteLine(result);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
} async static Task<string> GetInfoAsync(string name)
{
await Task.Delay(TimeSpan.FromSeconds(2));
return name+",你好。";
} Task t = WithWait();
t.Wait();

这样就可以获取到异步任务的返回值了。使用await后,C#立即创建了一个任务,其有一个后续操作任务,包含了await操作符后面的所有剩余代码。这个新任务也处理了异常传播。然后将任务返回到主方法中并等待其完成。

目前在最新的.NET Core中,基本上所有方法都默认在使用await/async这种模式来编写。所以学习这种异步编程方式还是特别有意义的。

好了,今天的学习就到这里,我们下篇文章见。

小寄语

人生短暂,我不想去追求自己看不见的,我只想抓住我能看的见的。

原创不易,给个关注。

我是阿辉,感谢您的阅读,如果对你有帮助,麻烦点赞、转发 谢谢。

C#多线程开发-了解C#5.0 05的更多相关文章

  1. 驱动开发学习笔记. 0.05 linux 2.6 platform device register 平台设备注册 2/2 共2篇

    驱动开发读书笔记. 0.05 linux 2.6 platform device register 平台设备注册 2/2 共2篇 下面这段摘自 linux源码里面的文档 : 内核版本2.6.22Doc ...

  2. 玩转iOS开发 - 多线程开发

    前言 本文主要介绍iOS多线程开发中使用的主要技术:NSOperation, GCD. NSThread, pthread. 内容依照开发中的优先推荐使用的顺序进行介绍,涉及多线程底层知识比較多的NS ...

  3. .NET基础拾遗(5)多线程开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  4. Java多线程开发系列之四:玩转多线程(线程的控制2)

    在上节的线程控制(详情点击这里)中,我们讲解了线程的等待join().守护线程.本节我们将会把剩下的线程控制内容一并讲完,主要内容有线程的睡眠.让步.优先级.挂起和恢复.停止等. 废话不多说,我们直接 ...

  5. Java之多线程开发时多条件Condition接口的使用

    转:http://blog.csdn.net/a352193394/article/details/39454157 我们在多线程开发中,可能会出现这种情况.就是一个线程需要另外一个线程满足某某条件才 ...

  6. Java进阶(三)多线程开发关键技术

    原创文章,同步发自作者个人博客,转载请务必以超链接形式在文章开头处注明出处http://www.jasongj.com/java/multi_thread/. sleep和wait到底什么区别 其实这 ...

  7. iOS多线程开发资源抢夺和线程间的通讯问题

    说到多线程就不得不提多线程中的锁机制,多线程操作过程中往往多个线程是并发执行的,同一个资源可能被多个线程同时访问,造成资源抢夺,这个过程中如果没有锁机制往往会造成重大问题.举例来说,每年春节都是一票难 ...

  8. iOS多线程开发

    概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操 ...

  9. iOS多线程开发--NSThread NSOperation GCD

    多线程 当用户播放音频.下载资源.进行图像处理时往往希望做这些事情的时候其他操作不会被中 断或者希望这些操作过程中更加顺畅.在单线程中一个线程只能做一件事情,一件事情处理不完另一件事就不能开始,这样势 ...

  10. [ios2]使用NSOperationQueue简化多线程开发和队列的优先级 【转】

    多线程开发是一件需要特别精心的事情,即使是对有多年开发经验的工程师来说. 为了能让初级开发工程师也能使用多线程,同时还要简化复杂性.各种编程工具提供了各自的办法.对于iOS来说,建议在尽可能的情况下避 ...

随机推荐

  1. word在指定页面设置页码

    需求:比如,毕业论文前面几页要求罗马数字(摘要-目录)(这里设置页码格式即可完成),后面全是阿拉伯数字(这里比较难搞,以下方法是解决这里的) 方法: 1. 光标移到指定页面的第一个字符所在的位置前 2 ...

  2. 2021年前端面试题-HTML篇

    1.<img>的title和alt有什么区别? 1.alt:图片加载失败时,显示在网页的替代文字 2.title:鼠标放在上面时显示的文字 3.alt是必要属性,title非必要 2.WE ...

  3. element table合计行自定义及单元格合并

    问题:项目需求要求table下面加合计一行 图片展示: 代码示例: TEMPLATE:   span-method是自定义table单元 show-summary是展示合并行 summary-meth ...

  4. 二叉树系列之二叉搜索树BST

    特征: 1.每个元素有唯一键值 2.任意一个结点键值,比它左子树的所有结点的键值大,比它右子树的所有结点的键值小 数据的基本操作: 1>建树和插入.逐个插入其他所有数据.新插入的数据于一个最底层 ...

  5. 【python】第一模块 步骤五 第一课、内存管理机制

    第一课.内存管理机制 一.课程介绍 1.1 课程概要 课程概要 赋值语句的内存分析 垃圾回收机制 内存管理机制 课程目标 掌握赋值语句内存分析方法 掌握id()和is()的使用 了解python的垃圾 ...

  6. 【python】第一模块 步骤四 第一课、初始正则表达式

    第一课.初始正则表达式 一.课程介绍 1.1 课程概要 步骤介绍 正则表达式入门及应用 正则的进阶 案例 综合项目实战 二.正则表达式的基本操作(多敲代码多做练习) 2.1 什么是正则表达式 什么是正 ...

  7. miou

    1. 前言 本文学习记录了机器学习中的分类常见评价指标以及分割中的MIoU. 主要有以下概念:Accuracy, Precision, Recall, Fscore,混淆矩阵,IoU及MIoU. 2. ...

  8. LOJ数列分块入门九题(中)

    #6281. 数列分块入门 5 - 题目 - LibreOJ (loj.ac) 区间开方,区间求和题. 显然,针对区间维护开方操作很难做到,于是考虑其值的性质,显然,int范围内的值最多开方6次就会变 ...

  9. React中的固定组件(随遇随记)

    <React.StrictMode></React.StrictMode>对组件中使用严格模式 <React.Fragment></React.Fragmen ...

  10. logic 运算符