C#——异步Task详情

news/2024/10/5 6:42:19/

C#异步Task

异步:多任务开始执行,只需要主任务 A 执行完成就算结束,主任务执行的时候,可以同时执行异步任务 B、C,主任务 A 可以不需要等待异步任务 B、C 的结果。

在C#中,异步编程主要通过async和await关键字来实现。这两个关键字是编写异步代码的核心,可以让你用同步的方式来写异步的代码。

 internal class Program{static  async void Main(string[] args){Console.WriteLine("异步操作开始");Console.WriteLine(await AsyncExample.DelayAsync()); // 启动异步并等待任务完成Console.WriteLine("异步结束");}}public class AsyncExample{public static async Task<string> DelayAsync(){// 模拟一个长时间运行的任务,如调用一个API或数据库await Task.Delay(1000); // 延迟1秒(1000毫秒)return "完成操作";}}

Task使用详情

在C#中,Task 是用于表示异步操作的类。它属于 System.Threading.Tasks 命名空间,并允许你以异步方式执行代码,从而不阻塞主线程。这对于I/O密集型操作(如网络请求或文件读写)或CPU密集型任务非常有用,因为它们可以让应用程序在等待操作时继续处理其他任务。

Task简单的使用

使用Task.Run()方法可以将工作提交给线程池来异步执行
    Task<int> task = Task.Run(() =>{int result = LongRunningCalculation(); // 长时间运行的计算return result;});// 等待任务完成并获取结果int finalResult = await task;

创建task对象,使用start启动异步

除了Task.Run(),还可以直接实例化Task并通过.Start()方法手动启动

    Console.WriteLine("开始异步任务...");Task task1 = new Task(() => {Console.WriteLine($"开始工作...");System.Threading.Thread.Sleep(1000); // 模拟耗时工作Console.WriteLine($"工作完成!");});task1.Start(); // 启动异步Console.WriteLine("所有任务都已完成!");

使用 Task.WhenAll 等待多个任务完成
    static  async void Main(string[] args){Console.WriteLine("开始多个异步任务...");Task task1 = Task.Run(() => DoWork("任务1"));Task task2 = Task.Run(() => DoWork("任务2"));Task task3 = Task.Run(() => DoWork("任务3"));// 等待所有任务完成await Task.WhenAll(task1, task2, task3);Console.WriteLine("所有任务都已完成!");}static void DoWork(string taskName){Console.WriteLine($"{taskName} 开始工作...");System.Threading.Thread.Sleep(1000); // 模拟耗时工作Console.WriteLine($"{taskName} 工作完成!");}

使用工厂模式创建任务
    // 使用 Task.Factory 创建一个任务Task task = Task.Factory.StartNew(() =>{Console.WriteLine("Hello from the task!");});// 等待任务完成task.Wait();

异步和多线程的区别和使用场景

区别

C#中的异步编程(Asynchronous Programming)和多线程(Multithreading)都用于编写能同时处理多个任务的程序,但它们有重要的区别:

异步编程主要用于I/O密集型任务,而多线程可以用于CPU密集型任务。

异步方法在不阻塞调用线程的情况下等待长时间运行的任务完成。

多线程可以在多个线程之间分配CPU时间,从而允许它们在同一时间内执行。

异步通常比多线程更高效,因为它减少了线程间的上下文切换成本。

场景

当需要执行I/O操作时,使用异步操作更合适。I/O操作不仅包括了直接的文件、网络的读写,还包括数据库操作、Web Service、HttpRequest以及.net Remoting等跨进程的调用。而线程的适用范围则是那种需要长时间CPU运算的场合,例如耗时较长的图形处理和算法执行。


http://www.ppmy.cn/news/1473505.html

相关文章

MySQL——JDBC中对象解释

DriverManager Class.forName("com.mysql.cj.jdbc.Driver"); // 固定写法&#xff0c;加载驱动 Connection connection DriverManager.getConnection(url, username, password); // Connection:代表数据库 // 数据库设置自动提交 // 事务提交 // 自动回滚 connecti…

C#——MD5 base64加密-base64加密解密

MD5 base64加密 在C#中&#xff0c;MD5是一个不可逆的加密算法&#xff0c;因为它是散列函数&#xff0c;用于创建信息的唯一指纹&#xff08;也称为摘要&#xff09;。不过&#xff0c;可以使用MD5进行加密&#xff0c;然后使用Base64对结果进行编码。但是&#xff0c;请注意…

Vatee万腾平台:智慧生活的无限可能

在科技日新月异的今天&#xff0c;我们的生活正被各种智能技术悄然改变。从智能家居到智慧城市&#xff0c;从个人健康管理到企业数字化转型&#xff0c;科技的力量正以前所未有的速度渗透到我们生活的每一个角落。而在这场智能革命的浪潮中&#xff0c;Vatee万腾平台以其卓越的…

wireshark与tcpdump使用

文章目录 wireshark与tcpdump使用tcpdump过滤expression表达式wireshark的显示过滤器tcpdump语法wireshark与tcpdump使用 tcpdump过滤 官网:http://www.tcpdump.org 需要安装libpcap # 示例 tcpdump -vv -i any port 80 or port 443 -s0 -w /home/tkg.pcapexpression表达式…

Lianwei 安全周报|2024.07.01

新的一周又开始了&#xff0c;以下是本周「Lianwei周报」&#xff0c;我们总结推荐了本周的政策/标准/指南最新动态、热点资讯和安全事件&#xff0c;保证大家不错过本周的每一个重点&#xff01; 政策/标准/指南最新动态 01 出于安全考虑&#xff0c;拜登下令禁用卡巴斯基杀毒…

爬虫笔记0

问题梳理: <dl>&#xff1a;Definition List&#xff08;定义列表&#xff09; <dt>&#xff1a;Definition Term&#xff08;一般放标题&#xff09; <dd>&#xff1a;Definition Description&#xff08;定义列表项&#xff0c;数据所在&#xff09; &l…

Kafka如何防止消息丢失

持久化存储&#xff1a; Kafka 使用基于日志的存储模型。每个主题的分区都会被分割成多个片段&#xff08;Segment&#xff09;&#xff0c;每个片段都是一个可追加的日志文件。生产者发送的每条消息都会被追加到对应分区的当前活跃片段&#xff08;active segment&#xff09;…

CTF常用sql注入(三)无列名注入

0x06 无列名 适用于无法正确的查出结果&#xff0c;比如把information_schema给过滤了 join 联合 select * from users;select 1,2,3 union select * from users;列名被替换成了1,2,3&#xff0c; 我们再利用子查询和别名查 select 2 from (select 1,2,3 union select * f…