zoukankan      html  css  js  c++  java
  • 再谈async与await

    回顾C#5.0是如何进行异步编程的

    static void Main(string[] args)
    {
        string url = "https://docs.microsoft.com/zh-cn/dotnet/core/api/system";
        Task task = WriteWebRequestSizeAsync(url);
        var x = task.IsCompleted;
        while (!task.Wait(100))
        {
            Console.Write(".");
        }
    
    }
    static async Task WriteWebRequestSizeAsync(string url)
    {
        try
        {
            WebRequest request = WebRequest.Create(url);
            WebResponse response = await request.GetResponseAsync();
            using (var reader = new StreamReader(response.GetResponseStream()))
            {
                string text = await reader.ReadToEndAsync();
                Console.WriteLine(FormatBytes(text.Length));
            }
        }
        catch (WebException)
        {
    
        }
        //省略部分Catch块
    }

    这个代码在上一篇同步VS异步中也有的 http://www.cnblogs.com/cheesebar/p/6553310.html

    上一篇着重记录了基于C#5.0之前是如何进行异步编程的,这里就在探讨一下async和await

    首先去掉async

    1.这里表明标记为 async 的方法为异步方法

    2.await只能在异步方法中使用,并且await后面方法返回值必须为Task或者Task<Result>

    现在去掉await(保留async)并把方法改为同步

    1.这里表明单有async没有await操作符的方法将以同步方式运行(好吧是都写着呢)

    问题:async标记的方法(并且使用了await),那么它总是异步执行的吗

    实际上,在调用方法内部的异步操作之前,它总是以同步执行的,可以和TPL(Task Parallel Library)执行过程相比较,await只是提供了一个异步操作的流程控制,async就是告诉编译器,这里我将可能会有异步方法的同步调用(await后面必须为一个异步方法,但在await的上下文环境中,它是阻塞的)

    没有await会怎么样

    static void Main(string[] args)
    {
        var task = Async一天();
        while (!task.Wait(100))
        {
            Console.Write("一天进行中...");
        }
        Console.WriteLine("一天结束了...");
    }
    static async Task Async一天()
    {
        Async七点();
        Async八点();
        Async十一点();
        Async十八点();
    }
    static Task Async七点()
    {
        Task task = Task.Run(() =>
        {
            Console.WriteLine("七点起床...");
            Thread.Sleep(1000);
        });
        return task;
    }
    static Task Async八点()
    {
        Task task = Task.Run(() =>
        {
            Console.WriteLine("八点上班...");
            Thread.Sleep(1000);
        });
        return task;
    }
    static Task Async十一点()
    {
        Task task = Task.Run(() =>
        {
            Console.WriteLine("十一点吃午饭...");
            Thread.Sleep(1000);
        });
        return task;
    }
    static Task Async十八点()
    {
        Task task = Task.Run(() =>
        {
            Console.WriteLine("十八点吃晚饭...");
            Thread.Sleep(1000);
        });
        return task;
    }

    Ctrl+F5输出

    await来控制异步方法的执行流程

    修改一下Async一天方法

    static async Task Async一天()
    {
        await Async七点();
        await Async八点();
        await Async十一点();
        await Async十八点();
    }

  • 相关阅读:
    csharp customer style print
    C++各大有名库的介绍
    关联,依赖,泛化(又称继承分为扩展或包含),实现,聚合(共享),复合(组合)
    有关数据库设计经验简介
    Msxml2.XMLHTTP Microsoft.XMLHTTP new XMLHttpRequest
    用例图
    设计模式之抽象工厂模式
    银行软件业务开发分类杂谈多年前的旧文
    #ifndef、#def、#endif说明
    C#.NET向现有文件添加文本+创建一个新文本文件并写入一个字符串
  • 原文地址:https://www.cnblogs.com/cheesebar/p/6554084.html
Copyright © 2011-2022 走看看