C# 中的 async 和 await

C# 中的 async 和 await

本教程将讨论 C# 中的异步编程。

C# 中的异步编程

如果同步应用程序中有任何进程被阻止,则整个应用程序将被阻止并停止响应,直到该特定进程完成为止。在这种情况下,我们可以使用异步编程。通过异步编程,我们的应用程序可以继续在后台执行一些独立的任务,直到执行该特定进程为止。在异步编程中,我们的整个应用程序不仅仅依赖于一个耗时的过程。异步编程用于 I/O 绑定或 CPU 绑定的任务。异步编程的主要用途是创建一个响应式用户界面,该界面在等待 I/O 绑定或 CPU 绑定的进程完成其执行时不会卡住。awaitasync 关键字用于 C# 中的异步编程。await 关键字将控制权交还给调用函数。await 关键字是启用 C# 异步编程的主要关键字。async 关键字启用 await 关键字。使用 await 关键字的函数必须具有 async 关键字,并在 C# 中返回 Task 对象。如果没有 C# 中的 async 关键字,就不能使用 await 关键字。下面的代码示例演示了 C# 中的同步编程。

using System;
using System.Threading.Tasks;

namespace async_and_await {
  class Program {
    public static void process1() {
      for (int i = 0; i < 5; i++) {
        Console.WriteLine("Process 1");
        Task.Delay(100).Wait();
      }
    }
    public static void process2() {
      for (int i = 0; i < 5; i++) {
        Console.WriteLine("Process 2");
        Task.Delay(100).Wait();
      }
    }
    static void Main(string[] args) {
      process1();
      process2();
    }
  }
}

输出:

Process 1
Process 1
Process 1
Process 1
Process 1
Process 2
Process 2
Process 2
Process 2
Process 2

在上面的代码中,函数 process1()process2() 是独立的进程,但是 process2() 函数必须等待 process1() 函数的完成。可以使用 C# 中的 asyncawait 关键字将此简单的同步编程代码转换为异步编程。

using System;
using System.Threading.Tasks;

namespace async_and_await {
  class Program {
    public static async Task process1() {
      await Task.Run(() => {
        for (int i = 0; i < 5; i++) {
          Console.WriteLine("Process 1");
          Task.Delay(100).Wait();
        }
      });
    }
    public static void process2() {
      for (int i = 0; i < 5; i++) {
        Console.WriteLine("Process 2");
        Task.Delay(100).Wait();
      }
    }
    static void Main(string[] args) {
      process1();
      process2();
    }
  }
}

输出:

Process 2
Process 1
Process 1
Process 2
Process 2
Process 1
Process 1
Process 2
Process 2
Process 1

在上面的代码中,我们使用了 asyncawait 关键字将前面的示例转换为异步编程。输出清楚地表明,process2() 函数不会等待完成 process1() 函数。在 process1() 函数的定义中,我们使用了 async 关键字来建议这是一个异步执行的函数。process1() 函数中的 await 关键字将控件返回给主函数,然后该主函数调用 process2() 函数。控制权在 process1()process2() 函数之间不断切换,直到 process1() 函数完成为止。

Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe
Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn