首页 > 编程语言 >C#中await /async 的使用场景,优点,使用方法介绍

C#中await /async 的使用场景,优点,使用方法介绍

时间:2023-12-08 10:11:27浏览次数:33  
标签:异步 Task Console C# await WriteLine async

 

async/await 是 C# 中异步编程的关键特性,它使得异步代码编写更为简单和直观。下面深入详细描述了 async/await 的使用场景、优点以及一些高级使用方法,并提供了相应的实例源代码。

使用场景:

  1. I/O 操作: 异步编程特别适用于涉及 I/O 操作(如文件读写、网络请求等)的场景。在等待 I/O 操作完成的过程中,CPU 可以继续执行其他任务,提高程序的并发性。
  2. GUI 应用程序: 在 GUI 应用程序中,避免阻塞主线程是至关重要的。使用 async/await 可以确保在进行长时间运行的任务时,GUI 界面保持响应。
  3. 并行编程: 在涉及多个任务的并行编程中,async/await 可以简化代码的编写,提高代码的可读性和维护性。
  4. Web 服务: 在处理 Web 请求时,异步操作可以确保服务器资源的高效利用,提高系统的吞吐量。

优点:

  1. 简化异步编程: async/await 使得异步编程更加直观和易于理解。代码看起来像是同步的,但实际上是异步执行的。
  2. 避免阻塞: 使用 async/await 可以避免在等待 I/O 操作完成时阻塞线程,提高程序的并发性。
  3. 提高性能: 在异步操作中,CPU 可以在等待的过程中执行其他任务,提高系统的整体性能。
  4. 简化错误处理: 使用 try/catch 结构可以捕获异步操作中的异常,使错误处理更加简便。

使用方法:

基本使用:

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        Console.WriteLine("Start");
        await DoAsyncTask();
        Console.WriteLine("End");
    }

    static async Task DoAsyncTask()
    {
        Console.WriteLine("Async Task Start");
        await Task.Delay(2000); // 模拟异步操作
        Console.WriteLine("Async Task End");
    }
}

高级使用方法:

  • 并发执行多个异步任务:
using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        Console.WriteLine("Start");

        Task task1 = DoAsyncTask("Task 1", 2000);
        Task task2 = DoAsyncTask("Task 2", 1000);

        await Task.WhenAll(task1, task2);

        Console.WriteLine("End");
    }

    static async Task DoAsyncTask(string taskName, int delay)
    {
        Console.WriteLine($"{taskName} Start");
        await Task.Delay(delay);
        Console.WriteLine($"{taskName} End");
    }
}
  • 取消异步操作:
using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        Console.WriteLine("Start");

        CancellationTokenSource cts = new CancellationTokenSource();
        Task task = DoAsyncTask(cts.Token);

        // 模拟一段时间后取消任务
        await Task.Delay(1000);
        cts.Cancel();

        try
        {
            await task;
        }
        catch (TaskCanceledException)
        {
            Console.WriteLine("Task canceled");
        }

        Console.WriteLine("End");
    }

    static async Task DoAsyncTask(CancellationToken cancellationToken)
    {
        Console.WriteLine("Async Task Start");
        await Task.Delay(5000, cancellationToken); // 模拟异步操作
        Console.WriteLine("Async Task End");
    }
}

这些示例展示了 async/await 在不同场景下的使用方法,包括基本使用、并发执行多个异步任务以及取消异步操作。希望这些例子对你理解 async/await 的使用有所帮助。

 

标签:异步,Task,Console,C#,await,WriteLine,async
From: https://www.cnblogs.com/hanbing81868164/p/17884355.html

相关文章

  • Predicting gene expression from histone modifications with self-attention based
    Predictinggeneexpressionfromhistonemodificationswithself-attentionbasedneuralnetworksandtransferlearningYuchiChen 1, MinzhuXie 1, JieWen 1Affiliations expandPMID: 36588793 PMCID: PMC9797047 DOI: 10.3389/fgene.2022.1081......
  • Graph regularized non-negative matrix factorization with prior knowledge consist
    Graphregularizednon-negativematrixfactorizationwithpriorknowledgeconsistencyconstraintfordrug-targetinteractionspredictionJunjunZhang 1, MinzhuXie 2 3Affiliations expandPMID: 36581822 PMCID: PMC9798666 DOI: 10.1186/s1285......
  • Drug response prediction using graph representation learning and Laplacian featu
    DrugresponsepredictionusinggraphrepresentationlearningandLaplacianfeatureselectionMinzhuXie 1 2, XiaowenLei 3, JianchenZhong 3, JianxingOuyang 3, GuijingLi 3Affiliations expandPMID: 36494630 PMCID: PMC9733001 DOI: ......
  • CSS 网页适配 iPhone全面屏
    前言iPhoneX取消了物理按键,改成底部小黑条,这一改动导致网页出现了比较尴尬的屏幕适配问题。对于网页而言,顶部(刘海部位)的适配问题浏览器已经做了处理,所以我们只需要关注底部与小黑条的适配问题即可(即常见的吸底导航、返回顶部等各种相对底部fixed定位的元素)。 适配之前需要......
  • Predict potential miRNA-disease associations based on bounded nuclear norm regul
    PredictpotentialmiRNA-diseaseassociationsbasedonboundednuclearnormregularizationYidongRao 1, MinzhuXie 1, HaoWang 1Affiliations expandPMID: 36072658 PMCID: PMC9441603 DOI: 10.3389/fgene.2022.978975 SigninFreePMCa......
  • 记录springboot的一次使用socketio的经历
    pom中加入依赖<dependency><groupId>com.corundumstudio.socketio</groupId><artifactId>netty-socketio</artifactId><version>2.0.6</version></dependency>......
  • 关于异常HOST_E_EXITPROCESS_TIMEOUT
    简介HOST_E_EXITPROCESS_TIMEOUT,是指在.NET应用程序中,Host进程超时导致退出的错误状态。它不是定义在ntstatus.h,而是clr的状态。定义在coreclr/src/pal/prebuilt/inc/corerror.h头文件中。#defineHOST_E_EXITPROCESS_TIMEOUTEMAKEHR(0x1029)当Host进程要求退出应用程序时,CLR......
  • CH582 CH592 CH573 IO功能映射
    CHBLE系列芯片IO功能脚都是固定的,不可以随意指定。但是部分功能脚有映射功能,可以固定映射到某个对应IO(寄存器设置的固定映射)功能脚有默认的IO,通过映射可以映射到对应固定的IO上,如下所示:在引脚图上标记显示(以TXD0和RXD0为例,默认在PB4PB7,可以映射到PA14PA15,这两个脚名称是TX......
  • LDAEXC: LncRNA-Disease Associations Prediction with Deep Autoencoder and XGBoost
    LDAEXC:LncRNA-DiseaseAssociationsPredictionwithDeepAutoencoderandXGBoostClassifier. 作者: LuCuihong; XieMinzhu作者背景: CollegeofInformationScienceandEngineering,HunanNormalUniversity,Changsha,China.; CollegeofInformation......
  • C++(双冒号 :: )
    在C++中,双冒号::是作用域操作符(ScopeResolutionOperator)。它有两个主要用途:命名空间的使用:在例子中,seeta::ModelSetting表示ModelSetting类位于seeta命名空间中。命名空间用于组织代码,以防止命名冲突。通过::操作符,你可以指定在哪个命名空间中查找相应的标识符(类、......