在C# 中,可以使用asyc+await来完成一个异步方法

async用来标志一个使用了await的方法是非阻塞API,是一个异步方法,就当成一个普通关键字就行了。关键是await,await是配合 Task、Task<TResult>或者非阻塞API使用的。它也是多线程操作。await表示等待task的操作,阻塞了这个方法,这个异步方法的内部是线性的,是从上之下的,等执行到await停下来,返回方法的调用方,同时执行调用方接下来的代码和异步方法中的代码。对于异步方法本身来说,方法内部是线性的,但是对于调用异步方法的主体来说,是并行的。

1、task和async的区别

场景不同。task用于多线程编程,主要用于与当前线程无关的操作,比如我开一个线程去把队列里面的日志写到本地文件,这个队列可能很长,我直接开一个线程去写就行了,反正我又不用这个写日志这个行为返回什么值;至于async标识一个异步方法,我需要用到这个异步方法的返回值Task<TResult>,但是这个方法中可能执行时间有点长,你先不用等我了去干其它的,你干其它的的同时我计算这个值,我们并行操作,等你用到这个值的时候我没执行完你就接着等,我完成了你就直接用。我们一起工作,肯定不亏。

2、async代码

  1. /*
  2. ========================================================================
  3. 演示功能:
  4. 1.async方法内部是线性执行的
  5. 2.调用async方法的主体和async方法是并行执行的
  6. 3.在使用async返回值时,若async返回了值直接使用,还没有完成就等待完成
  7. 总结:
  8. async中代码是顺序执行的,只是执行到await会说我这个操作可能要很长时间,如果你急着用那你就等我完成,如果你不急着用你就先干别的,
  9. 你正在干别的时候如果我完成了你想用的时候就直接用,如果你完成了我还没完成那你就接着等我完成。
  10. 反正我们是并行的,肯定不亏。
  11. ========================================================================
  12. */
  13. using System;
  14. using System.Collections.Generic;
  15. using System.Linq;
  16. using System.Text;
  17. using System.Threading;
  18. using System.Threading.Tasks;
  19.  
  20. namespace AsyncDemo
  21. {
  22. class Program
  23. {
  24. public static int a = ;
  25. static void Main(string[] args)
  26. {
  27. var result = Add();
  28. // 等待3秒输出,说明是在使用值得时候进行等待
  29. // 输出6,说明async是线性执行的
  30. Console.WriteLine(result.Result);
  31. var result2 = Add();
  32. // 再次等待3秒
  33. Thread.Sleep();
  34. Console.WriteLine();
  35. Console.WriteLine(result2.Result);
  36. // 同时输出1和6,说明是并行执行的,Add开始沉睡3秒的时候主线程同时沉睡3秒,然后主线程醒了同时result2被赋予了值
  37. Console.Read();
  38. }
  39. public static async Task<int> Add()
  40. {
  41. await Task.Run(() =>
  42. {
  43. Thread.Sleep();
  44. a += ;
  45. });
  46. a = ;
  47. return a;
  48. }
  49. }
  50. }

项目工程地址:https://github.com/Beiluola/AsyncDemo

async异步方法的更多相关文章

  1. SpringBoot中Async异步方法和定时任务介绍

    1.功能说明 Spring提供了Async注解来实现方法的异步调用. 即当调用Async标识的方法时,调用线程不会等待被调用方法执行完成即返回继续执行以下操作,而被调用的方法则会启动一个独立线程来执行 ...

  2. C#~异步编程再续~async异步方法与同步方法的并行

    返回目录 今天晚上没事写了个测试的代码,又看了看.net的并行编程,两个方法,一个是异步async修饰的,另一个是普通的方法,在控制台程序的Main方法里去调用这两个方法,会有什么结果呢? 首先我们看 ...

  3. 异步方法的意义何在,Async和await以及Task的爱恨情仇,还有多线程那一家子。

    前两天刚感受了下泛型接口的in和out,昨天就开始感受神奇的异步方法Async/await,当然顺路也看了眼多线程那几个.其实多线程异步相关的类单个用法和理解都不算困难,但是异步方法Async/awa ...

  4. 又踩.NET Core的坑:在同步方法中调用异步方法Wait时发生死锁(deadlock)

    之前在将 Memcached 客户端 EnyimMemcached 迁移 .NET Core 时被这个“坑”坑的刻骨铭心(详见以下链接),当时以为只是在构造函数中调用异步方法(注:这里的异步方法都是指 ...

  5. async和await关键字实现异步编程

    async和await关键字实现异步编程 异步编程   概念 异步编程核心为异步操作,该操作一旦启动将在一段时间内完成.所谓异步,关键是实现了两点:(1)正在执行的此操作,不会阻塞原来的线程(2)一旦 ...

  6. 理解koa2 之 async + await + promise

    koa是下一代的Node.js web框架. 我们首先使用koa来实现一个简单的hello world吧!假如目前的项目结构如下: ### 目录结构如下: koa-demo1 # 工程名 | |--- ...

  7. .NET Core 2.1 源码学习:看 SocketsHttpHandler 如何在异步方法中连接 Socket

    在 .NET Core 2.1 中,System.Net.Sockets 的性能有了很大的提升,最好的证明是 Kestrel 与 HttpClient 都改为使用 System.Net.Sockets ...

  8. c# 关于async/await异步编程的浅析和使用

    线程的同步运行,时效性慢,异步运行,时效性快! 在c#5.0引出了async/await关键字,可以用其来进行异步编程. async/await定义异步方法的语法如下: 1.在方法的返回类型前面加上a ...

  9. async方法:async+await

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

随机推荐

  1. Restful&RestSharp

    RestSharp 一个.NET(C#)的HTTP辅助类组件 https://www.cnblogs.com/lilunjia/p/7090015.html C#使用RestSharp实现post发送 ...

  2. Nginx实战入门教程

    Nginx 简介 Nginx是一个高性能的http和反向代理服务器,它看起来好像不太符合英文单词的拼写习惯,因为Nginx是由名为 伊戈尔·赛索耶夫 的俄罗斯人开发的.Nginx主要特点为占用内存小, ...

  3. 学python着几个要搞清楚WSGI和uWSGI区别

    1 WSGI是一种通信协议 2 uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信. 3 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器.

  4. cannot nest '/dubboService/src/main/resources' inside '/dubboService/src/main' .To enable the nesting exclude '/resources' from '/dubboService/src/main'

    eclipse Maven--->update Project时出现以上错误: cannot nest '/dubboService/src/main/resources' inside '/d ...

  5. Workgroup&Domain(Realm)

    [工作组 Work Group] 在一个网络内,可能有成百上千台电脑,如果这些电脑不进行分组,都列在“网上邻居”内,可想而知会有多么乱.为了解决这一问题,Windows 9x/NT/2000就引用了“ ...

  6. canvas动画--demo

    canvas动画:bubble

  7. word2vec 细节解析1

    count.extend(collections.Counter(list1).most_common(2))表示:使用collections.Counter统计list1列表重单词的频数,然后使用m ...

  8. Liunx下如何使用kettle

    在windows下完成所有操作, 把xxx.ktr上传到liunx, Pan.sh xxx.ktr 就完成了

  9. tomcat 403 forbidden

    server.xml和tomcat-users.xml都是设置于过了,还是403,最后发现context.xml中多了一行 <Valve className="org.apache.c ...

  10. 在线编辑器CKeditor,CKfinder

    在线编辑器的分类: 常见的在线编辑器有很多,比较常用的有FCKeditor(在线编辑器——Ajax 浏览器 端服务器文件管理器),CKeditor(在线编辑器与服务器端文件管理器的分离,) 其中CKe ...