首页 > 编程语言 >C#中多线程的使用(3)async/awaite

C#中多线程的使用(3)async/awaite

时间:2022-11-21 19:22:37浏览次数:40  
标签:异步 Task Console C# await WriteLine async 多线程

一、简介

在这最后一部分,记录一下async/awaite这一组关键字的用法, async/await这一组关键字是在.net framework 4.5开始才有的,async 是用来修饰方法,await用于方法内部等待异步的完成,若在只使用async而未使用await则该方法会以同步的方式执行,所以尽量将async/await成对使用。

二、使用

2.1 在异步方法中,当程序执行到await时,先进入方法,将属于当前线程的语句全部执行,异步计算会放在线程池中计算

public static void Main()
{
    Test1();//1
    Console.WriteLine("end");//2
}

private static async Task Test1()
{
    Console.WriteLine("开始");//3
    await Test2();//4
    Console.WriteLine("结束");//5
}
private static async Task Test2()
{
    Console.WriteLine("开始2"); //6
    await Task.Delay(3000);//7
    Console.WriteLine("结束2");//8
}

执行结果: 开始 开始2 end 结束2 结束

程序刚开始执行时,进入方法Test1(),执行Console.WriteLine("开始"),然后进入方法Test2(),执行Console.WriteLine("开始2"),当遇到异步方法await Task.Delay(3000)时,程序回到await Test2(),因为这里也有await 修饰,所以当前线程回到Main()中继续向下执行Console.WriteLine("end"),当异步方法Task.Delay(3000)执行完毕,则当前线程接着执行await 下面的程序 Console.WriteLine("结束2"),执行完Test2()则回到Test1()向下执行Console.WriteLine("结束")

 

 

2.2 带返回值的异步Task

private static async Task<int> GetSumAsync(int count)
{
    int sum = 0;
    await Task.Run(() =>
                   {
                       for (int i = 0; i < count; i++)
                       {
                           Thread.Sleep(500);
                           sum += count;
                       }
                   });
    return sum;
}

public static void Main()
{
    int sum = await GetSumAsync(10);
    Console.WriteLine(sum);//打印计算结果
}

 

标签:异步,Task,Console,C#,await,WriteLine,async,多线程
From: https://www.cnblogs.com/just-like/p/16912918.html

相关文章

  • static关键字
    Static关键字1.静态属性publicclassStudent{privatestaticintage;//静态的变量publicdoublescore;//非静态的变量publicstaticvoidmain(Stri......
  • Electron 打包 (electron-builder)
    本文只测试了Windows10下打包Windows基础安装包更多花哨的配置,请戳官方文档https://www.electron.build/​www.electron.build/构建基础项目,可以参考之前文章依赖安......
  • 在华为云 OSC 上快速部署 EMQX MQTT 集群
    ​​EMQXKubernetesOperator​​是EMQ发布的一个封装、部署和管理工具,也是一个特定的应用控制器,方便DevOps人员在Kubernetes上编排EMQXMQTT消息服务集群,管理其......
  • 【转】Win2003下Apache性能优化 增加13/1/30
    一直习惯在Solaris和linux下跑amp,前些时服务器硬盘坏掉,所以启用新服务器。新系统是Windows2003Server,在上面按Unix上的经验配置Apache和Mysql时问题多多,经过折腾,总算是......
  • javascript - 练习题:事件练习 - 扫雷
    HTML<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="w......
  • ArrayList remove删除元素 为什么会出现ConcurrentModificationException异常
    ArrayListremove删除元素先看代码ArrayList<String>list=newArrayList<>();list.add("Java"); list.add("Python");for(Stringitem:list)......
  • Pytorch在训练时冻结某些层使其不参与反向传播
    笔记摘抄:https://blog.csdn.net/qq_36429555/article/details/118547133定义网络#定义一个简单的网络classnet(nn.Module):def__init__(self,num_class=10):......
  • 使用easy excel进行简单的导入导出表格
    1.创建项目,导入easyexcel的依赖<!--easyexcel依赖--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3......
  • 10:pycharm的调试模式
    Pycharm开发环境的调试进行调试的核心是设置断点。程序执行到断点时,暂时挂起,停止执行。就像看视频按下停止一样,我们可以详细的观看停止处的每一个细节。断点程序运行到......
  • Oracle表空间管理
    Oracle表空间管理1.查看表空间信息SQL>SELECTtablespace_name,status,contents,logging,extent_management,allocation_type,segment_space_managementfrom......