await和async简介

  await和async是在C#5中引入,并且在.NetFramewor4.5以及.NetCore中进行了支持。主要是解决性能瓶颈,并且增强系统的响应能力。

msdn关于await以及async运行机理的描述

以上demo详细的描述了使用await时程序的运行机制,需要注意的以下几点:

  • 第五步:执行完成后如果发现下一步还有await即设置了中断点,此时命令会直接跳出此方法即执行6,换句话说,await表达式执行时暂停并不构成方法退出,只会导致 finally 代码块不运行
  • 第七步:当执行当getStringTask返回结果(第七步)及await等待方法执行完成开始执行后续操作时(8)此时的线程已经和第四步执行的线程不同编号了,但是此时4所在线程上下文中的AsyncLocal变量会被复制到await返回后的线程上下文中。详细参照https://www.cnblogs.com/liyong-blackStone/p/10270526.html
  • async 和 await 关键字不会创建其他线程。 因为异步方法不会在其自身线程上运行,因此它不需要多线程.

Task简介

Task类的表示单个操作不会返回一个值,通常以异步方式执行Task对象是一种的中心思想基于任务的异步模式。首次引入.NET Framework 4 中。
Task可以通过以下几种方式开始执行:

            Task.Run(() =>{Console.WriteLine("无返回值委托");});Task.Run<int>(() =>{Console.WriteLine("带返回值委托");return 1;});Task t = new Task(() =>{Console.WriteLine("声明一个Task可以后续通过t.run执行");});TaskFactory factory = new TaskFactory();factory.StartNew<int>(() =>{Console.WriteLine("通过TaskFactory执行");return 1;});Task t4 = new Task(() =>{Console.WriteLine("同步执行");});// 同步执行t4.RunSynchronously();

task的执行方式这里不多做介绍,下面主要说下Task的异常处理。

异步方法内部的异常处理

.Net中异步方法由 async修饰符标记,通常包含一个或多个await表达式或语句。await表达式将await运算符应用于 Task 或Task。由于在异步方法中通常会存在多个线程,而子线程中的异常信息不能自动的抛到主线程上,所以要想在主线程上获得子线程的异常信息,需要借助于返回的task这个对象。以下为Msdn给出的一段示例代码:

public async Task DoSomethingAsync()
{Task<string> theTask = DelayAsync();try{string result = await theTask;Debug.WriteLine("Result: " + result);}catch (Exception ex){Debug.WriteLine("Exception Message: " + ex.Message);}Debug.WriteLine("Task IsCanceled: " + theTask.IsCanceled);Debug.WriteLine("Task IsFaulted:  " + theTask.IsFaulted);if (theTask.Exception != null){Debug.WriteLine("Task Exception Message: "+ theTask.Exception.Message);Debug.WriteLine("Task Inner Exception Message: "+ theTask.Exception.InnerException.Message);}
}private async Task<string> DelayAsync()
{await Task.Delay(100);// Uncomment each of the following lines to// demonstrate exception handling.//throw new OperationCanceledException("canceled");//throw new Exception("Something happened.");return "Done";
}// Output when no exception is thrown in the awaited method:
//   Result: Done
//   Task IsCanceled: False
//   Task IsFaulted:  False// Output when an Exception is thrown in the awaited method:
//   Exception Message: Something happened.
//   Task IsCanceled: False
//   Task IsFaulted:  True
//   Task Exception Message: One or more errors occurred.
//   Task Inner Exception Message: Something happened.// Output when a OperationCanceledException or TaskCanceledException
// is thrown in the awaited method:
//   Exception Message: canceled
//   Task IsCanceled: True
//   Task IsFaulted:  False

对于异步线程的执行结果,最多有三种情况

  • 正常执行结束:可以通过IsCompletedSuccessfully 属性表示任务正常结束,并成功执行。特别说明:IsCompleted为true只能表示执行完成,当任务处于三种最终状态之一: RanToCompletion, Faulted,或Canceled。时他都为true
  • 发生异常:发生异常时,可以通过返回的task对象中的IsFaulted属性判断,为true时表示发生异常,如果要获取具体的异常信息,可以通过以下以下方式获取
    task.Exception.InnerException.Message
  • 异步线程被取消:异步线程被取消时task中的IsCanceled属性会被设置为true
    了解取消任务可以参考msdn示例:
using System;
using System.Threading;
using System.Threading.Tasks;public class Example
{public static void Main(){// Create a cancellation token and cancel it.var source1 = new CancellationTokenSource();var token1 = source1.Token;source1.Cancel();// Create a cancellation token for later cancellation.var source2 = new CancellationTokenSource();var token2 = source2.Token;// Create a series of tasks that will complete, be cancelled, // timeout, or throw an exception.Task[] tasks = new Task[12];for (int i = 0; i < 12; i++){switch (i % 4) {// Task should run to completion.case 0:tasks[i] = Task.Run(() => Thread.Sleep(2000));break;// Task should be set to canceled state.case 1:   tasks[i] = Task.Run( () => Thread.Sleep(2000),token1);break;         case 2:// Task should throw an exception.tasks[i] = Task.Run( () => { throw new NotSupportedException(); } );break;case 3:// Task should examine cancellation token.tasks[i] = Task.Run( () => { Thread.Sleep(2000); if (token2.IsCancellationRequested)token2.ThrowIfCancellationRequested();Thread.Sleep(500); }, token2);   break;}}Thread.Sleep(250);source2.Cancel();try {Task.WaitAll(tasks);}catch (AggregateException ae) {Console.WriteLine("One or more exceptions occurred:");foreach (var ex in ae.InnerExceptions)Console.WriteLine("   {0}: {1}", ex.GetType().Name, ex.Message);}   Console.WriteLine("\nStatus of tasks:");foreach (var t in tasks) {Console.WriteLine("   Task #{0}: {1}", t.Id, t.Status);if (t.Exception != null) {foreach (var ex in t.Exception.InnerExceptions)Console.WriteLine("      {0}: {1}", ex.GetType().Name,ex.Message);}}}
}
// The example displays output like the following:
//   One or more exceptions occurred:
//      TaskCanceledException: A task was canceled.
//      NotSupportedException: Specified method is not supported.
//      TaskCanceledException: A task was canceled.
//      TaskCanceledException: A task was canceled.
//      NotSupportedException: Specified method is not supported.
//      TaskCanceledException: A task was canceled.
//      TaskCanceledException: A task was canceled.
//      NotSupportedException: Specified method is not supported.
//      TaskCanceledException: A task was canceled.
//
//   Status of tasks:
//      Task #13: RanToCompletion
//      Task #1: Canceled
//      Task #3: Faulted
//         NotSupportedException: Specified method is not supported.
//      Task #8: Canceled
//      Task #14: RanToCompletion
//      Task #4: Canceled
//      Task #6: Faulted
//         NotSupportedException: Specified method is not supported.
//      Task #7: Canceled
//      Task #15: RanToCompletion
//      Task #9: Canceled
//      Task #11: Faulted
//         NotSupportedException: Specified method is not supported.
//      Task #12: Canceled

转载于:https://www.cnblogs.com/liyong-blackStone/p/10276769.html

.Net 多线程 异步编程 Await、Async和Task相关推荐

  1. C#——await与async实现多线程异步编程

    以前,我们或许用过Thread,在主线程执行的时候,新开另一个新线程,来执行新方法. 今天看别人发给我的一段代码的时候发现了一个不认识的await,但是又感觉很熟悉的样子,感觉是线程那块儿的东西,查了 ...

  2. .NET异步编程之新利器——Task与Await、Async

    一.  FrameWork 4.0之前的线程世界    在.NET FrameWork 4.0之前,如果我们使用线程.一般有以下几种方式: 使用System.Threading.Thread 类,调用 ...

  3. 异步编程(async 和 await)

    1.概念 异步编程是一项关键技术,可以直接处理多个核心上的I/O阻塞和并发操作 2.使用场景 对于存在IO密集型(例如从网路请求数据.访问数据库和写入到文件系统)和CPU密集型(例如大量的计算)的任务 ...

  4. 异步编程的 async/await

    async/await 和 Generators + co 的写法非常的相似,只是把用于声明 Generator 函数的 * 关键字替换成了 async 并写在了 function 关键字的前面,把 ...

  5. await原理 js_深入浅出node.js异步编程 及async await原理

    最近看了一些文章对于async await的原理及概念的解析,我觉得很多时候有些不太准确. 尤其是对于async和await会阻塞线程的说法更是有些扯淡了,JS本身就是单线程的语言如果await会阻塞 ...

  6. @async 默认线程池_.NET Web应用中为什么要使用async/await异步编程?

    布莱恩特:.NET Core开发精选文章目录,持续更新,欢迎投稿!​zhuanlan.zhihu.com 前言 1.什么是async/await? await和async是.NET Framework ...

  7. 同步方法 调用异步防范_.NET Web应用中为什么要使用async/await异步编程?

    布莱恩特:.NET Core开发精选文章目录,持续更新,欢迎投稿!​zhuanlan.zhihu.com 前言 1.什么是async/await? await和async是.NET Framework ...

  8. Unity中的异步编程【1】—— Unity与async 、 await

    新手在Unity里写东西,一个方法的内容如果写复杂了,容易把Uinty写死,就会卡帧,用流行的话来总结就是:在Update里面活生生把天聊死了. 此外,如果新手才入门,不擅长使用消息.事件来进行异步的 ...

  9. C#:异步编程和线程的使用(.NET 4.5 ),异步方法改为同步执行

    摘自:http://www.codeproject.com/Articles/996857/Asynchronous-programming-and-Threading-in-Csharp-N(葡萄城 ...

最新文章

  1. mysql表只有frm文件_MYSQL数据文件--.frm文件(只有.frm文件时的表结构恢复)
  2. 前端进阶之如何正确判断this的指向?
  3. mysql怎么查看索引情况_mysql 查看索引使用情况
  4. LintCode 125. 背包问题 II(DP)
  5. 【LeetCode】4月4日打卡-Day20-接雨水
  6. c语言basic解释器,要理解解释器,做一个小解释器----小话c语言(20)
  7. php sslv3握手失败,Boost Beast握手:sslv3警报握手失败错误
  8. 科技行业的起步时代已结束
  9. python上机实验报告读取文件_Python程序设计实验八:文件
  10. L2-003 月饼 (25 point(s))
  11. pandas dataframe统计填充空值大全
  12. 液压系统原理动画_3大类12种液压阀工作原理,直观动画演示一看就懂
  13. Java牛客项目课_仿牛客网讨论区_第七章
  14. 推荐几个好用实用的免费图标素材(好看的icon)
  15. 小麦颗粒数目matlab,求关于matlab中rice.png图像中的米粒数目的算法
  16. SCAU------8615 快乐
  17. java word模板 变量,java导出word模板
  18. 云脉OCR文档管理软件档案加工管理必备
  19. 使用Quads绘制函数曲线
  20. STM32内部flash详解(1)

热门文章

  1. Javascript之浏览器对象
  2. python-pygame激动时刻你我共享
  3. Shrio Unable to execute ‘doFinal‘ with cipher instance
  4. GoogLeNet补充(Inception V4)
  5. hdu1232(简单并查集)
  6. Android截屏方法总结
  7. android的窗口机制分析------ViewRoot类
  8. Android开发工具之Android Studio--如何打包sdk通过arr包的方式
  9. JZOJ 1251. 收费站
  10. python画完图 程序暂停运行_[Python实战]你也能写的计时器程序