class Program{static void Main(string[] args){var result = DownloadStringWithTimeout("http://www.yueyangdujia.com");Console.WriteLine("异步方法执行中");for (int i = 0; i < 3; i++){System.Threading.Thread.Sleep(1000);Console.WriteLine("休息了"+(i+1)+"秒");}     var str= result.Result;   //这里使用到异步方法的返回值,需要等待异步方法执行完毕。         Console.WriteLine("异步方法执行后,同步执行以下代码");Console.WriteLine(str);Console.Read();}static async Task<string> DownloadStringWithTimeout(string uri){using (var client=new HttpClient()){var downloadTask = client.GetStringAsync(uri);var timeoutTask = Task.Delay(3000);var completedTask = await Task.WhenAny(downloadTask, timeoutTask);if (completedTask == timeoutTask){System.Threading.Thread.Sleep(2000);Console.WriteLine("异步方法执行完成");return null;}System.Threading.Thread.Sleep(2000);Console.WriteLine("异步方法执行完成");return await downloadTask;}}}

执行顺序如 Console.WriteLine显示一样。DownloadStringWithTimeout和下面的代码一起执行,大概在2秒的时候执行完毕。var str= result.Result;调用异步方法返回值的时候会等候异步方法执行。



下来去掉一些代码如下:
    class Program{static void Main(string[] args){var result = DownloadStringWithTimeout("http://www.yueyangdujia.com");         var str= result.Result;   //这里使用到异步方法的返回值,需要等待异步方法执行完毕。
            Console.WriteLine(str);Console.Read();}static async Task<string> DownloadStringWithTimeout(string uri){using (var client=new HttpClient()){var downloadTask = client.GetStringAsync(uri);var timeoutTask = Task.Delay(3000);var completedTask = await Task.WhenAny(downloadTask, timeoutTask);if (completedTask == timeoutTask){return null;}return await downloadTask;}}}

WhenAny接受两个异步方法参数返回先执行完成的方法。以上可以调整Task.Delay的参数。如果足够小则返回NULL。

还有一个WhenAll方法会等所有方法都执行完毕后再一起返回,代码如下。

   static async Task<string> Down(){Task<string> tast1 = DownloadStringWithTimeout("http://www.yueyangdujia.com");Task<string> tast2 = DownloadStringWithTimeout("http://www.yueyangdujia.com");Task<string> tast3 = DownloadStringWithTimeout("http://www.yueyangdujia.com");string[] arr = await Task.WhenAll(tast3, tast2, tast1);return String.Concat(arr);} 

 

转载于:https://www.cnblogs.com/harpz/p/4904742.html

C#异步编程(一):异步基础相关推荐

  1. async And await异步编程活用基础

    async And await异步编程活用基础 原文:async And await异步编程活用基础 好久没写博客了,时隔5个月,奉上一篇精心准备的文章,希望大家能有所收获,对async 和 awai ...

  2. Javascript异步编程之一异步原理

    本系列的例子主要针对node.js环境,但浏览器端的原理应该也是类似的. 本人也是Javascript新手,把自己这段时间学习积累的要点总结下来,希望可以对同样在学习Javascript/node.j ...

  3. python2异步编程_Python 异步编程入门

    本文是写给 JavaScript 程序员的 Python 教程. Python 的异步编程,其他人可能觉得很难,但是 JavaScript 程序员应该特别容易理解,因为两者的概念和语法类似.JavaS ...

  4. 异步编程之异步编程与多线程编程的联系和区别

    1.异步编程与多线程的区别 共同点:异步和多线程两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性 不同点: (1)线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能,线程本质上是 ...

  5. python2异步编程_python异步编程 (转载)

    转自:https://zhuanlan.zhihu.com/p/27258289 本文将会讲述Python 3.5之后出现的async/await的使用方法,以及它们的一些使用目的,如果错误,欢迎指正 ...

  6. python2异步编程_python异步编程入门

    这几天看代码,总是会接触到很多异步编程,之前只想着实现功能,从来没考虑过代码的运行快慢问题,故学习一番. 从0到1,了解python异步编程的演进 1.urllib与requests爬虫 reques ...

  7. java jpa 异步编程_异步处理时的JPA

    java jpa 异步编程 几年前,在Java世界中,几乎显而易见的是,每个"企业"类项目都需要JPA与数据库进行通信. JPA是Joel Spolsky描述的" 泄漏抽 ...

  8. php怎么进行异步编程,php异步编程是怎样的?

    前言 传统的 php-fpm 一个进程执行一个请求,要达到多少并发,就要生成多少个进程.更糟糕的是每次请求都需要重新编译执行,导致并发一直上不来.因此出现了 Swoole 和 WorkerMan 两个 ...

  9. android 异步编程,flutter异步编程-事件循环、Isolate、Stream(流)

    事件循环.Isolate 开始前我们需要明白 Dart 是单线程的并且 Flutter 依赖于 Dart 如果你知道js 中的event loop 将很好理解dart的整个异步过程 先看一段代码 im ...

  10. 一文了解异步编程基础

    什么是异步编程? 异步编程是指并发编程的范式,其中除了单个主应用程序线程之外,工作可以委托给一个或多个并行工作线程.这被称为非阻塞系统,其中整体系统速度不受订单执行的影响,并且多个进程可以同时发生. ...

最新文章

  1. 你的首个 Progressive Web App
  2. Myeclipse使用过程配置汇总
  3. 虚拟服务器设置upnp,TP-Link路由器如何设置UPNP开启【设置步骤】
  4. nginx大量TIME_WAIT的解决办法--转
  5. matlab向量的角标,【MATLAB】利用冒号表达式获得子矩阵
  6. 如何用C#代码查找某个路径下是否包含某个文件
  7. centos lnmp源码安装mysql_CentOS 6.6 下源码编译安装MySQL 5.7.5
  8. 万字详解Lambda、Stream和日期
  9. HTML转义字符大全<转>
  10. python习题week3
  11. 为什么ES模块比CommonJS更好?
  12. JAVA面向对象OOP多态→抽象类abstract、接口interface实现implement、final不变修饰符、样例代码
  13. 走得快?走的远?---【锻炼身体 好好学习】
  14. Android底层开发
  15. 用Python写一个Excel汇总和比对小程序
  16. 基于jsp的博客系统
  17. 【JZOJ 4623】搬运干草捆
  18. lizard的基本使用
  19. 什么是H5页面及又该如何制作?
  20. App避免被杀死,常驻后台

热门文章

  1. jQuery Validate 提交表单验证失败扩展方法
  2. ubuntu下google浏览器(chromium)flash插件安装
  3. SharePoint 2010 同步用户Services 一直Starting 终极解决方案
  4. latex的资料ftp
  5. MFC文件打开格式,MFC默认打开文档后缀(支持打开多图像格式)
  6. 攻防:如何防止动态hook绕过jni签名校验
  7. Vue 路由router的两种模式
  8. gpa-user-guide-for-ubuntu-host
  9. 使用ajax+php+mysql实现数据库定时刷新
  10. Codeforces第一次rated比赛