关于C#中的async/await的理解

  1. 使用async标记的方法被认为是一个异步方法,如果不使用await关键字,调用跟普通方法没有区别
cs 复制代码
 static async Task Main(string[] args)
 {
     Console.WriteLine("主线程id:" + Thread.CurrentThread.ManagedThreadId);

     TestAwait();

     Console.WriteLine("主线程id:" + Thread.CurrentThread.ManagedThreadId);
}

private static async Task TestAwait()
{
    Console.WriteLine("执行线程id:" + Thread.CurrentThread.ManagedThreadId);

    Thread.Sleep(2000);  //模拟耗时操作

    Console.WriteLine("执行完线程id:" + Thread.CurrentThread.ManagedThreadId);
}

执行结果:

2.当使用await关键字时,异步方法会暂时挂起,让出当前线程的控制权,而不会阻塞线程。当被await的异步操作完成后,异步方法会恢复执行,并返回结果。

在大多数情况下,异步操作并不会创建新的线程,而是通过利用I/O完成端口或其他异步机制来实现异步操作。这样可以避免创建额外的线程,提高程序的性能和资源利用率。

cs 复制代码
 static async Task Main(string[] args)
 {
     Console.WriteLine("主线程id:" + Thread.CurrentThread.ManagedThreadId);

     TestAwait();

     Console.WriteLine("主线程id:" + Thread.CurrentThread.ManagedThreadId);
    
     Console.WriteLine("Hello, World!");

     Console.ReadLine();

}

private static async Task TestAwait()
{
    Console.WriteLine("执行线程id:" + Thread.CurrentThread.ManagedThreadId);

    await Task.Delay(2000);

    Console.WriteLine("执行完线程id:" + Thread.CurrentThread.ManagedThreadId);
}

3.使用task.result获取执行结果,会阻塞调用线程

cs 复制代码
 static async Task Main(string[] args)
 {
     Console.WriteLine("主线程id:" + Thread.CurrentThread.ManagedThreadId);

     int a = TestAwait().Result;

     Console.WriteLine("主线程id:" + Thread.CurrentThread.ManagedThreadId);
    
     Console.WriteLine("Hello, World!");

     Console.ReadLine();

}

private static async Task<int> TestAwait()
{
    Console.WriteLine("执行线程id:" + Thread.CurrentThread.ManagedThreadId);

    await Task.Delay(2000);

    Console.WriteLine("执行完线程id:" + Thread.CurrentThread.ManagedThreadId);

    return 1;
}
相关推荐
wuguan_17 分钟前
C#/VP联合编程之绘制图像与保存
开发语言·c#
时光追逐者31 分钟前
一个基于 .NET + Vue 实现的通用权限管理平台(RBAC模式),前后端分离模式,开箱即用!
前端·vue.js·c#·.net·.net core
czhc11400756631 小时前
通信组件2.3
c#
wy3136228211 小时前
C#——报错:System.Net.Sockets.SocketException (10049): 在其上下文中,该请求的地址无效。
开发语言·c#·.net
油丶酸萝卜别吃1 小时前
死信队列(DLQ)深度解析:原理、配置、实践与系统可靠性保障
c#·linq
缺点内向10 小时前
C#编程实战:如何为Word文档添加背景色或背景图片
开发语言·c#·自动化·word·.net
学海无涯书山有路13 小时前
async-await异步编程
c#
切糕师学AI13 小时前
ARM 汇编器中的伪指令(Assembler Directives)
开发语言·arm开发·c#
lzhdim17 小时前
C#开发的提示显示例子 - 开源研究系列文章
开发语言·c#
人工智能AI技术17 小时前
【C#程序员入门AI】向量数据库入门:C#集成Chroma/Pinecone,实现AI知识库检索(RAG基础)
人工智能·c#