异步.异步是在.net .45里面提供的一个新的方法

它主要用在.三个方面

1.网络访问

2.磁盘访问

3.延迟很长时间的步骤

它主要有2个关键字

Async  Await

Async  怎么工作

demo_1_下载一个html的2个方式来比较下

    public static void Run()
        {
            //请注意 输出顺序..over之后才会输出DumpWebPageAsync 里面的page
            var url = "http://abujj.me";

            Console.WriteLine("1");
            DumpWebPage(url);

            Console.WriteLine("2");
            DumpWebPageAsync(url);

            Console.WriteLine("over");
            Console.ReadKey();
        }

        // 正常下载
        static void DumpWebPage(string uri)
        {
            WebClient webClient = new WebClient(); string page = webClient.DownloadString(uri);
            Console.WriteLine(page.Substring(0,50));
        }

        // 异步下载
       static async void DumpWebPageAsync(string uri)
        {
            WebClient webClient = new WebClient();
            string page = await webClient.DownloadStringTaskAsync(uri);
            Console.WriteLine(page.Substring(0, 50));
        } 
 
 

如果是异步方法.请后面加入Async后缀..来一标识下

DownloadStringTaskAsync 返回的是

public Task<string> DownloadStringTaskAsync(string address);

了解异步

下面代码是最简单的异步行为..没有用async  .把一个回调函数作为参数的一个方法

void GetHostAddress(string hostName, Action<IPAddress> callback) 
private void LookupHostName()
{
    GetHostAddress("abujj.me", OnHostNameResolved);
}
private void OnHostNameResolved(IPAddress address)
{
    // Do something  ........
}

上面这个代码 还可以使用匿名方法或者 lamada表达式来实现这个回调

private void LookupHostName()
{
    int aUsefulVariable = 3;
    GetHostAddress("oreilly.com", address =>
        {
            // Do something ...
        });
}

这样写有一个好处.就是在do something里面,可以使用外部的变量值

坏处就是,try_catch  抛异常 不容易控制..

Task(并行)

Task Parallel 库,net是4/0 引入的.async是c#5.0引入的. 里面包含了大量的task 代码.

然后用Task继续更改代码

private void LookupHostName()
{
    Task<IPAddress[]> ipAddressesPromise = Dns.GetHostAddressesAsync("abujj.me");
    ipAddressesPromise.ContinueWith(_ =>
        {
            IPAddress[] ipAddresses = ipAddressesPromise.Result;

            // Do something       ...
        });
}

它返回一个Task<T> ,当使用ContinueWith 注册回调函数

ContinueWith  函数隶属Task . 意思就是创建一个Task.当完成时,异步执行的延续任务

写Async 代码

从文章开头的webClient就知道大概的async功能.

一步一步分析下这个代码

Task<string> DownloadStringTaskAsync(string address) 返回Task<string> 
 
所以可以这么写

Task<string> myTask =webClient.DownloadStringTaskAsync(uri);
// Do something here
string page = await myTask;

当第一句话返回Task<string>其实并没有开始下载页面

只有当await的时候.才回去执行下载页面

这样.我们就可以开启多个并行任务.比如

//注册2个任务
Task<string> firstTask = webClient1.DownloadStringTaskAsync("abujj.me");
Task<string> secondTask = webClient2.DownloadStringTaskAsync("abujj.me");

//开始执行
string firstPage = await firstTask;
string secondPage = await secondTask

这有个问题.就是如果第一个执行await 抛异常..那么第二个永远不会await了

Async  返回类型

1.void

2.Task

3.Task<T> or T

async 关键字,出现在方法的声明上.就像 public关键字一样 .async 唯一的效果也就是已编译上体现

如果实行继承. async关键字毫无作用..比如

class BaseClass
{
    public virtual async Task<int> AlexsMethod()
    {
       ........
    }
}
class SubClass : BaseClass
{
    // 重载
    public override Task<int> AlexsMethod()
    {
       ...
    }
}

重载后..少了async关键字.

声明接口..不能使用async 关键字 .原因就上上面一样..因为不需要.如果需要返回Task .那实现者可能会选择async

异步 匿名委托

Func<Task<int>> getNumberAsync = async delegate { return 3; };

async lamada :

Func<Task<string>> getWordAsync = async () => "hello";

await

int myNum = await AlexsMethodAsync(await myTask, await StuffAsync());
这个情况,自己可以试验下
 

什么情况不能用await

 
1. try-catch
try
{
    page = await webClient.DownloadStringTaskAsync("abujj.me");
}
catch (WebException)
{
    page = await webClient.DownloadStringTaskAsync("http://abujj.me");
 }

当你抛异常的时候..

正确写法

bool failed = false;
try
{
    page = await webClient.DownloadStringTaskAsync("http://abujj.me");
}
catch (WebException)
{
    failed = true;
}
if (failed)
{
    page = await webClient.DownloadStringTaskAsync("http://abujj.me");
}

基于Task_based的异步

前面说道Async用到了大量的Task

 
 
 
 
 
 
 
 原文:http://abujj.me/archives/522
 

[待续]Async in C# 1的更多相关文章

  1. Await Async和Thread.waitAll想法?未完待续

    [管理员]四九-李冰-修行者(2216529884) 2017/7/3 17:15:12 看着就可以了,这种东西是有使用场景的.并不是你用了就一定有提升的 [管理员]上海-xx科技(lovepoint ...

  2. Promise及Async/Await

      一.为什么有Async/Await? 我们都知道已经有了Promise的解决方案了,为什么还要ES7提出新的Async/Await标准呢? 答案其实也显而易见:Promise虽然跳出了异步嵌套的怪 ...

  3. async异步操作和同步上下文

    第8章 哪个线程运行我的代码 看到社区里的朋友没有翻译完这本书,我接着对一下的章节进行翻译 像我之前说的,异步编程就是关于线程的.那就意味着我们需要理解在C#程序中哪个.NET线程什么时候运行我们的代 ...

  4. 异步Promise及Async/Await最完整入门攻略

    一.为什么有Async/Await? 我们都知道已经有了Promise的解决方案了,为什么还要ES7提出新的Async/Await标准呢? 答案其实也显而易见:Promise虽然跳出了异步嵌套的怪圈, ...

  5. 异步Promise及Async/Await可能最完整入门攻略

    此文只介绍Async/Await与Promise基础知识与实际用到注意的问题,将通过很多代码实例进行说明,两个实例代码是setDelay和setDelaySecond. tips:本文系原创转自我的博 ...

  6. C#5.0 异步编程async/await用法

    微软在发布VS2012的同时推出了C#5.0,其中包含了async和await 代码如下: class Program { private static readonly Stopwatch watc ...

  7. async/await运用-前端表单弹窗验证同步书写方式(React)

    在前端项目中,我们经常会碰到这样的场景: 当前我们有一个表单需要填写,在完成表单填写后经过校验之后会弹出短信或者其他形式验证码,进行补充校验,然后一起提交给接口. 场景如下图: 当前为创建操作,编辑操 ...

  8. [C#] async 的三大返回类型

    async 的三大返回类型 序 博主简单数了下自己发布过的异步文章,已经断断续续 8 篇了,这次我想以 async 的返回类型为例,单独谈谈. 异步方法具有三个可让开发人员选择的返回类型:Task&l ...

  9. async & await 的前世今生(Updated)

    async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了.但是这也给我们编程埋下了一些隐 ...

随机推荐

  1. tl;drLegal ——开源软件license的搜索引擎

    TLDRLegal - Open Source Licenses Explained in Plain English可以很方便查询各个开源license的总结(能做什么,不能做什么),还能比较不同的 ...

  2. SpringMVC DispatcherServlet 说明与web配置

    使用Spring MVC,配置DispatcherServlet是第一步. DispatcherServlet是一个Servlet,所以能够配置多个DispatcherServlet. Dispatc ...

  3. 每天一个JavaScript实例-从一个div元素删除一个段落

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  4. [转] Creating a Simple RESTful Web App with Node.js, Express, and MongoDB

    You can find/fork the sample project on GitHub Hey! This and all my other tutorials will soon be mov ...

  5. iOS 复杂动画之抽丝剥茧

    一.前言 随着开发者的增多和时间的累积,AppStore已经有非常多的应用了,每年都有很多新的APP产生.但是我们手机上留存的应用有限,所以如何吸引用户,成为产品设计的一项重要内容.其中炫酷的动画效果 ...

  6. css考核点整理(一)-浮动的理解和清除浮动的几种方式

    浮动的理解和清除浮动的几种方式 clear语法:clear : none | left | right | both 取值:none : 默认值.允许两边都可以有浮动对象left : 不允许左边有浮动 ...

  7. 在DataTable中更新、删除数据

    /*在DataTable中选择记录*/            /* 向DataTable中插入记录如上,更新和删除如下:             * ----但是在更新和删除前,首先要找出要更新和删除 ...

  8. java判断字符串是否为空的方法总结

    http://blog.csdn.net/qq799499343/article/details/8492672 以下是java 判断字符串是否为空的四种方法: 方法一: 最多人使用的一个方法, 直观 ...

  9. strut2.xml中result param详细设置

    1.Struts2.xml配置文件: 2.Jsp中:说明回调函数一个参数即可.把上面的俩个参数msg和page封装到一起了 3.msg是Action中全局变量 可参考:http://qiaolevip ...

  10. Typescript 团队合作的利器

    前言 在介绍Typescript 之前,我需要隆重介绍一个人: 安德斯·海尔斯伯格(Anders Hejlsberg,1960.12~),丹麦人,Turbo Pascal编译器的主要作者,Delphi ...