再谈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十八点();
}

 

posted @ 2017-03-15 15:52  行走即歌  阅读(432)  评论(0编辑  收藏  举报


感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮。本文欢迎各位转载,但是转载文章之后必须在文章页面中给出作者和原文连接