【小白专用24.6.8】c#异步方法 async task调用及 await运行机制

news2024/11/25 16:45:54

await是C#中用于等待异步操作完成的关键字。它通常用于异步方法内部,使得在等待异步操作期间,线程可以继续执行其他操作,从而保持程序的响应性。
 
在使用await时,需要注意以下几点:
 
1. async修饰符: 使用async关键字修饰一个方法,以便在异步方法内部使用await关键字异步方法的定义方式为async Task 或 async Task<T>,其中Task表示一个异步操作的返回类型
 
2. 等待异步操作: 使用await关键字等待一个异步操作完成。异步操作可以是返回Task、Task<T>、ValueTask、ValueTask<T>等的方法调用。
 
3. 异步操作的返回值: 使用await等待异步操作完成后,可以获取异步操作的结果。结果的类型通常与异步方法的返回类型相对应

采用异步方法实现

        static void Main(string[] args)
        {
            #region 
            Console.WriteLine("Main executing....currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
            DoSomething();
            Console.WriteLine("Main executed..currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
            #endregion
            Console.ReadKey(true);

        }

        /// <summary>
        /// 执行耗时的异步操作
        /// 注意:代码实现中如果是异步,那么此方法名就需要(标记)成异步方法,即加上:aysnc修饰词
        /// </summary>
        private async static void DoSomething()
        {
            //耗时操作有:IO/Web跳转等操作。
            //归结为:网络,文件操作是耗时操作。
            Console.WriteLine("耗时操作开始。。。currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
            await Task.Run(() => {
                Console.WriteLine("延迟3秒进行中...currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(3000);
            });
            Console.WriteLine("耗时操作结束。。。currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
        }

//static void Main(string[] args)
static async Task Main(string[] args)
{
    // 创建一个异步方法并调用
    await DoAsyncWork(); //使用await等待异步操作完成
    Console.WriteLine("Main method completed.");

}

static async Task DoAsyncWork()
{
    Console.WriteLine("Starting async work...");

    // 使用await等待异步操作完成
    string result = await FetchDataAsync();
    //读取响应内容
    Console.WriteLine($"Async work completed: {result}");
}

static async Task<string> FetchDataAsync()
{
    using (HttpClient client = new HttpClient())
    {
        // 异步调用HTTP请求
        HttpResponseMessage response = await client.GetAsync("https://www.baidu.com/");

        // 异步读取响应内容
        string content = await response.Content.ReadAsStringAsync();

        return content;
    }
}

在上述示例中,await关键字用于等待异步的HTTP请求完成,并异步读取响应内容。这样,在等待操作完成期间,程序可以继续执行其他操作,保持响应性
 
需要注意的是,await关键字只能在async方法内部使用。它在C#中是处理异步编程的重要工具,使得编写异步操作的代码变得更加清晰和易于理解。

Task.Delay()方法

internal class Program
{
    static void Main(string[] args)
    {
        Simple ds = new Simple();
        ds.DoRun();
        Console.Read();
    }
}
class Simple
{
    Stopwatch sw = new Stopwatch();
    public void DoRun()
    {
        Console.WriteLine("Caller: Before call");
        ShowDealyAsync();
        Console.WriteLine("Caller: After call");
    }

    private async void ShowDealyAsync()
    {
        sw.Start();
        Console.WriteLine("  Before Delay: {0}", sw.ElapsedMilliseconds);
        await Task.Delay(5000);      //执行到await表达式时,立即返回到调用方法,等待5秒后执行后续部分
        Console.WriteLine(" After Delay : {0}", sw.ElapsedMilliseconds);//后续部分
    }
}

Task.Delay方法只会延缓异步方法中后续部分执行时间,当程序执行到await表达时,一方面会立即返回调用方法,执行调用方法中的剩余部分,这一部分程序的执行不会延长。另一方面根据Delay()方法中的参数,延时对异步方法中后续部分的执行

~~~~~~~~~~

Task.Run() 和 await Task.Run() 都涉及异步编程,但它们在使用场景和效果上有一些区别。

1. **Task.Run():**
   - Task.Run() 是一个用于在后台线程上执行代码块的方法。它将指定的代码块包装在一个新的Task中,并在后台线程上运行。它不会阻塞调用线程,因此允许后台线程并发执行
   - Task.Run() 返回一个Task,你可以使用 await 来等待它的完成,也可以不等待并继续执行其他操作
   - 适用于需要在后台执行一些耗时操作,但不需要等待其完成的情况。

2. **await Task.Run():**
   - await Task.Run() 也是在后台线程上执行代码块,但是它等待 Task 执行完成,并且会在异步方法内部暂停直到后台线程上的代码块完成执行。这样可以保持调用线程的响应性。
   - await Task.Run() 通常在异步方法内部使用,用于将同步操作转换为异步操作。
   - 适用于需要将同步操作转换为异步操作,以保持UI的响应性。

总的来说,Task.Run() 用于在后台执行代码块,不需要等待其完成。而 await Task.Run() 则用于在后台执行代码块,但需要等待其完成,并且用于将同步操作转换为异步操作,以保持响应性。选择哪种方式取决于你的具体需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1805923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mac环境下,简单反编译APK

一、下载jadx包 https://github.com/skylot/jadx/releases/tag/v1.4.7 下载里面的这个&#xff1a;下载后&#xff0c;找个干净的目录解压&#xff0c;我是放在Downloads下面 二、安装及启动 下载和解压 jadx&#xff1a; 下载 jadx-1.4.7.zip 压缩包。将其解压到你希望的目…

C++ 史上首次超越 C,跃至榜二

TIOBE 公布了 2024 年 6 月的编程语言排行榜。 C在本月的TIOBE指数中成功超越了C&#xff0c;成为新的第二名。它是一种被广泛应用于嵌入式系统、游戏开发和金融交易软件等领域的编程语言。这次的排名是C在TIOBE指数中的历史最高位&#xff0c;同时也是C语言的历史最低位。 T…

排序-读取数据流并实时返回中位数

目录 一、问题描述 二、解题思路 1.顺序表排序法 2.使用大根堆、小根堆 三、代码实现 1.顺序表排序法实现 2.大根堆、小根堆法实现 四、刷题链接 一、问题描述 二、解题思路 1.顺序表排序法 &#xff08;1&#xff09;每次读取一个数就对列表排一次序&#xff0c;对排…

使用Python批量处理Excel的内容

正文共&#xff1a;1500 字 10 图&#xff0c;预估阅读时间&#xff1a;1 分钟 在前面的文章中&#xff08;如何使用Python提取Excel中固定单元格的内容&#xff09;&#xff0c;我们介绍了如何安装Python环境和PyCharm工具&#xff0c;还利用搭好的环境简单测试了一下ChatGPT提…

CPP入门:CPP的内存管理模式

一.new和delete操作自定义类型 1.1C语言的内存管理 在传统的C语言中&#xff0c;malloc和free是无法调用类的构造和析构函数的 #include <iostream> using namespace std; class kuzi { public:kuzi(int a, int b):_a(a), _b(b){cout << "我构造啦" &…

卷积的计算过程

卷积的计算过程 flyfish 包括手动计算&#xff0c;可视化使用torch.nn.Conv2d实现 示例 import torch import torch.nn as nn# 定义输入图像 input_image torch.tensor([[1, 2, 3, 0, 1],[0, 1, 2, 3, 4],[2, 3, 0, 1, 2],[1, 2, 3, 4, 0],[0, 1, 2, 3, 4] ], dtypetorch.f…

20240609如何查询淘宝的历史价格

20240609如何查询淘宝的历史价格 2024/6/9 18:39 百度&#xff1a;淘宝历史价格 淘宝历史价格查询网站 https://zhuanlan.zhihu.com/p/670972171 30秒学会淘宝商品历史价格查询&#xff01; https://item.taobao.com/item.htm?id693104421622&pidmm_29415502_2422500430_1…

AI菜鸟向前飞 — LangChain系列之十七 - 剖析AgentExecutor

AgentExecutor 顾名思义&#xff0c;Agent执行器&#xff0c;本篇先简单看看LangChain是如何实现的。 先回顾 AI菜鸟向前飞 — LangChain系列之十四 - Agent系列&#xff1a;从现象看机制&#xff08;上篇&#xff09; AI菜鸟向前飞 — LangChain系列之十五 - Agent系列&#…

sqlilabs靶场安装

05-sqllabs靶场安装 1 安装 1 把靶场sqli-labs-master.zip上传到 /opt/lampp/htdocs 目录下 2 解压缩 unzip sqli-labs-master.zip3 数据库配置 找到配置文件,修改数据库配置信息 用户名密码&#xff0c;修改为你lampp下mysql的用户名密码&#xff0c;root/123456host:la…

GraphQL(6):认证与中间件

下面用简单来讲述GraphQL的认证示例 1 实现代码 在代码中添加过滤器&#xff1a; 完整代码如下&#xff1a; const express require(express); const {buildSchema} require(graphql); const grapqlHTTP require(express-graphql).graphqlHTTP; // 定义schema&#xff0c;…

计算机网络:数据链路层 - 扩展的以太网

计算机网络&#xff1a;数据链路层 - 扩展的以太网 集线器交换机自学习算法单点故障 集线器 这是以前常见的总线型以太网&#xff0c;他最初使用粗铜轴电缆作为传输媒体&#xff0c;后来演进到使用价格相对便宜的细铜轴电缆。 后来&#xff0c;以太网发展出来了一种使用大规模…

启动xv6遇坑记录

我是在VMware上的Ubuntu22.04.4搭建的&#xff0c;启动xv6遇到超多bug&#xff0c;搞了好几天&#xff0c;所以记录一下。 目录 git push的时候报错 make qemu缺少包 运行make qemu时卡住 可能有影响的主机设置 git push的时候报错 remote: Support for password authent…

kafka-生产者事务-数据传递语义事务介绍事务消息发送(SpringBoot整合Kafka)

文章目录 1、kafka数据传递语义2、kafka生产者事务3、事务消息发送3.1、application.yml配置3.2、创建生产者监听器3.3、创建生产者拦截器3.4、发送消息测试3.5、使用Java代码创建主题分区副本3.6、屏蔽 kafka debug 日志 logback.xml3.7、引入spring-kafka依赖3.8、控制台日志…

vip学员作业--横屏下面怎么自适应展示竖屏应用方案征集(排除原生letterbox方式)

背景&#xff1a; 昨天相关的视频和公众号blog已经讲解了&#xff0c;横屏下如何正确显示竖屏app相关android原生的处理方案具体链接如下&#xff1a; https://mp.weixin.qq.com/s/P95rN7dBOSCENc38KZ4Ulg 采用了原生letterbox即装相框模式画面变成如下: letterbox上面画面…

Zabbix6.0自定义监控项

文章目录 一、自定义监控整体流程二、自定义监控案例1、监控TCP 443端口案例2、监控服务器异地登入(带参监控项) 一、自定义监控整体流程 操作端流程备注Agent端1️⃣ linux&#xff1a;通过命令、脚本取出对应的值2️⃣ linux&#xff1a;根据zbx要求按照格式、编写配置文件、…

Polar Web【中等】search

Polar Web【中等】search Contents Polar Web【中等】search思路&探索首页一般注入方式 EXP&效果Payload 总结 思路&探索 见到题目标题&#xff0c;预测可能有目录扫描或者输入框查询数据之类情况&#xff0c;具体细节在破解过程中才能清楚 打开站点&#xff0c;显…

less---20-28

less-20 这关登陆成功会显示cookie,所以抓包在cookie处注入 less-21 这关登陆成功会显示cookie,所以抓包在cookie处注入&#xff0c;发现不成功&#xff0c;查看代码发现被编码 先对注入语句进行base64编码再注入 less-22 闭合字符",同21关 less-23 这关查看代码发现…

什么是 AOF 重写?AOF 重写机制的流程是什么?

引言&#xff1a;在Redis中&#xff0c;持久化是确保数据持久性和可恢复性的重要机制之一。除了常见的RDB&#xff08;Redis Database&#xff09;持久化方式外&#xff0c;AOF&#xff08;Append Only File&#xff09;也是一种常用的持久化方式。AOF持久化通过记录Redis服务器…

总结七大排序算法

插入排序 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a;把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。实际中我们玩扑克牌时&#xff0c;就用了…

10.邮票问题

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/625 题目描述 有四种面值的邮票,分别是 …