.net Core 使用Async 和 Await 进行异步编程

本文概念部分参考官方文档:https://docs.microsoft.com/zh-cn/dotnet/standard/async-in-depth

了解异步

使用基于 .NET 任务的异步模型可直接编写绑定 I/O 和 CPU 的异步代码。 该模型由 Task 和 Task 类型以及 C# 和 Visual Basic 中的 async 和 await 关键字公开

任务和 Task<>

任务是用于实现称之为并发 Promise 模型的构造。 简单地说,它们“承诺”,会在稍后完成工作,让你使用干净的 API 与 promise 协作。

  • Task 表示不返回值的单个操作。
  • Task 表示返回 T 类型的值的单个操作。

默认情况下,任务在当前线程上执行,且在适当时会将工作委托给操作系统。任务运行时,使用 await 在任务完成前将控制让步于其调用方,可让应用程序和服务执行有用工作。 任务完成后代码无需依靠回调或事件便可继续执行。

以下示例来阐述 async 和 await 关键字如何使推断包含一系列异步指令的代码更为轻松

using System;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("运行序号               线程ID");
            Console.WriteLine("  1                       " + Thread.CurrentThread.ManagedThreadId);
            var task = First();
            Console.WriteLine("  4                       " + Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(1000);
            Console.WriteLine("  5                       " + Thread.CurrentThread.ManagedThreadId);
            task.Wait();
            Console.WriteLine("  7                       " + Thread.CurrentThread.ManagedThreadId);
            Console.ReadKey();
        }
        static async Task First()
        {
            //主线程
            Console.WriteLine("  2                       " + Thread.CurrentThread.ManagedThreadId);
            await Second();
            Console.WriteLine("  6                       " + Thread.CurrentThread.ManagedThreadId);
        }
        static async Task Second()
        {
            Console.WriteLine("  3                       " + Thread.CurrentThread.ManagedThreadId);
            ///新线程
            await Task.Run(() =>
            {
                Thread.Sleep(2000);
                Console.WriteLine("新线程                    " + Thread.CurrentThread.ManagedThreadId);
            });
        }
    }
}

``

运行结果:
.net Core 使用Async 和 Await 进行异步编程_第1张图片上述方式的签名中具有 async 修饰符。 它会向编译器发出信号,说明此方法包含 await 语句;也包含异步操作。
程序执行步骤(以执行序号说明);

  1. 主线程Main()函数,线程ID为1,打印出1
  2. 调用First()函数,打印出2
  3. 遇到关键字await,调用Second()函数,关键字await意思为等待方法Second()执行成功,打印出3,在两秒后开启一个新线程,新线程ID为4,ID是随机的.
  4. 主线程打印出4和5,两秒后,新线程开启成功,打印出新线程,Second()方法执行完成,await关键字任务完成,所以打印出6
  5. First()方法执行完成。打印出7
  6. 程序结束

可以看出来,在开启新线程的两秒钟内,主线程并没有阻塞,而是在这期间打印出了4和5,可以优化代码运行时间!!!

你可能感兴趣的:(.net Core 使用Async 和 Await 进行异步编程)