首页 > 编程语言 >C# 中的 Task

C# 中的 Task

时间:2024-12-13 09:29:24浏览次数:6  
标签:Task C# sum await int task 方法

文章目录


前言

  在 C# 中,Task代表一个异步操作。它允许你在不阻塞主线程的情况下执行耗时的操作,从而提高应用程序的响应性和性能。本教程将详细介绍 C# 中的Task。
在这里插入图片描述

一、Task 的基本概念

  Task是.NET Framework 4.0 引入的一种异步编程模型,它代表一个可能尚未完成的操作。Task可以表示任何异步操作,例如文件读取、网络请求、数据库查询等。与传统的异步编程模型相比,Task提供了一种更加简洁和高效的方式来处理异步操作。

二、创建 Task

使用异步方法

  C# 中的异步方法通常以async关键字开头,并返回一个Task或Task。例如:

   async Task<int> CalculateSumAsync()
   {
       int sum = 0;
       for (int i = 0; i < 100; i++)
       {
           sum += i;
       }
       return sum;
   }

  在这个例子中,CalculateSumAsync方法是一个异步方法,它返回一个Task,表示一个异步操作,该操作将计算从 0 到 99 的整数之和,并返回结果。

使用 Task.Run 方法

  Task.Run方法可以将一个委托作为参数,并在一个新的线程上执行该委托。例如:

   Task<int> task = Task.Run(() =>
   {
       int sum = 0;
       for (int i = 0; i < 100; i++)
       {
           sum += i;
       }
       return sum;
   });

  在这个例子中,Task.Run方法将一个 lambda 表达式作为参数,该表达式计算从 0 到 99 的整数之和,并返回结果。Task.Run方法返回一个Task,表示在新线程上执行的异步操作。

三、等待 Task 完成

使用 await 关键字

  await关键字用于等待一个Task完成。当使用await关键字等待一个Task时,当前方法会暂停执行,直到Task完成。例如:

   async Task<int> CalculateSumAsync()
   {
       int sum = 0;
       for (int i = 0; i < 100; i++)
       {
           sum += i;
       }
       return sum;
   }

   async Task Main()
   {
       int result = await CalculateSumAsync();
       Console.WriteLine(result);
   }

  在这个例子中,Main方法是一个异步方法,它调用CalculateSumAsync方法,并使用await关键字等待该方法完成。一旦CalculateSumAsync方法完成,result变量将被赋值为该方法的返回值,并在控制台上输出结果。

使用 Task.Wait 方法

  Task.Wait方法用于等待一个Task完成。与await关键字不同,Task.Wait方法会阻塞当前线程,直到Task完成。例如:

   Task<int> task = Task.Run(() =>
   {
       int sum = 0;
       for (int i = 0; i < 100; i++)
       {
           sum += i;
       }
       return sum;
   });

   task.Wait();
   int result = task.Result;
   Console.WriteLine(result);

  在这个例子中,task.Wait()方法会阻塞当前线程,直到task完成。一旦task完成,result变量将被赋值为task的返回值,并在控制台上输出结果。

四、处理 Task 的异常

使用 try-catch 块

  当等待一个Task时,可以使用try-catch块来捕获Task中发生的异常。例如:

   async Task<int> CalculateSumAsync()
   {
       int sum = 0;
       for (int i = 0; i < 100; i++)
       {
           sum += i;
       }
       throw new Exception("An error occurred.");
       return sum;
   }

   async Task Main()
   {
       try
       {
           int result = await CalculateSumAsync();
           Console.WriteLine(result);
       }
       catch (Exception ex)
       {
           Console.WriteLine(ex.Message);
       }
   }

  在这个例子中,CalculateSumAsync方法在计算总和的过程中抛出了一个异常。在Main方法中,使用try-catch块来捕获这个异常,并在控制台上输出异常消息。

使用 Task.Exception 属性

  Task.Exception属性返回一个AggregateException,其中包含了Task中发生的所有异常。例如:

   Task<int> task = Task.Run(() =>
   {
       int sum = 0;
       for (int i = 0; i < 100; i++)
       {
           sum += i;
       }
       throw new Exception("An error occurred.");
       return sum;
   });

   try
   {
       task.Wait();
       int result = task.Result;
       Console.WriteLine(result);
   }
   catch (AggregateException ex)
   {
       foreach (var innerException in ex.InnerExceptions)
       {
           Console.WriteLine(innerException.Message);
       }
   }

  在这个例子中,task.Wait()方法会阻塞当前线程,直到task完成。如果task中发生了异常,catch块将捕获AggregateException,并遍历其中的所有异常,在控制台上输出异常消息。

五、Task 的延续

使用 ContinueWith 方法

  ContinueWith方法用于在一个Task完成后执行另一个操作。例如:

   Task<int> task = Task.Run(() =>
   {
       int sum = 0;
       for (int i = 0; i < 100; i++)
       {
           sum += i;
       }
       return sum;
   });

   task.ContinueWith(t =>
   {
       Console.WriteLine(t.Result);
   });

  在这个例子中,task.ContinueWith方法在task完成后执行一个 lambda 表达式,该表达式输出task的结果。

使用 await 关键字和异步方法

  也可以使用await关键字和异步方法来实现Task的延续。例如:

   async Task<int> CalculateSumAsync()
   {
       int sum = 0;
       for (int i = 0; i < 100; i++)
       {
           sum += i;
       }
       return sum;
   }

   async Task PrintResultAsync(int result)
   {
       Console.WriteLine(result);
   }

   async Task Main()
   {
       int result = await CalculateSumAsync();
       await PrintResultAsync(result);
   }

  在这个例子中,Main方法首先调用CalculateSumAsync方法,并使用await关键字等待该方法完成。然后,它调用PrintResultAsync方法,并使用await关键字等待该方法完成。这样,PrintResultAsync方法就作为CalculateSumAsync方法的延续执行。

六、Task 的并行执行

使用多个 Task

  可以同时启动多个Task,并等待它们全部完成。例如:

   Task<int> task1 = Task.Run(() =>
   {
       int sum = 0;
       for (int i = 0; i < 100; i++)
       {
           sum += i;
       }
       return sum;
   });

   Task<int> task2 = Task.Run(() =>
   {
       int product = 1;
       for (int i = 1; i <= 10; i++)
       {
           product *= i;
       }
       return product;
   });

   Task.WaitAll(task1, task2);
   int sum = task1.Result;
   int product = task2.Result;
   Console.WriteLine(sum);
   Console.WriteLine(product);

  在这个例子中,同时启动了两个Task,一个计算从 0 到 99 的整数之和,另一个计算从 1 到 10 的整数之积。然后,使用Task.WaitAll方法等待这两个Task全部完成,并输出结果。

使用 Task.WhenAll 方法

  Task.WhenAll方法返回一个Task,当所有传入的Task都完成时,这个Task才完成。例如:

   Task<int> task1 = Task.Run(() =>
   {
       int sum = 0;
       for (int i = 0; i < 100; i++)
       {
           sum += i;
       }
       return sum;
   });

   Task<int> task2 = Task.Run(() =>
   {
       int product = 1;
       for (int i = 1; i <= 10; i++)
       {
           product *= i;
       }
       return product;
   });

   Task<int[]> tasks = Task.WhenAll(task1, task2);
   int[] results = await tasks;
   int sum = results[0];
   int product = results[1];
   Console.WriteLine(sum);
   Console.WriteLine(product);

  在这个例子中,使用Task.WhenAll方法等待两个Task全部完成,并返回一个包含两个Task结果的数组。然后,使用await关键字等待这个Task完成,并输出结果。

七、总结

  Task是 C# 中一种强大的异步编程模型,它允许你在不阻塞主线程的情况下执行耗时的操作。通过使用Task,你可以提高应用程序的响应性和性能,同时保持代码的简洁和可读性。
在这里插入图片描述

标签:Task,C#,sum,await,int,task,方法
From: https://blog.csdn.net/2401_83367969/article/details/144441938

相关文章

  • 94、基于AT89C52的OLED12832I2C液晶应用proteus仿真设计
    一、仿真原理图:二、仿真效果:三、相关代码:1、主函数:**************************************************************************************/voidmain(void){             SystemInit();   VariableInit();      OLED12832I2C......
  • Z-BlogPHP 1.6.4.2135 版本中 zbp 的 fullcurrenturl 有一个 bug,如何修正?
    在Z-BlogPHP1.6.4.2135版本中,zbp 的 fullcurrenturl 功能存在一个bug。这个bug可能会导致生成的当前页面完整URL不正确,影响某些功能的正常使用。以下是修正此问题的方法和步骤:理解 fullcurrenturl 功能:fullcurrenturl 是Z-BlogPHP中用于获取当前页面完整URL......
  • 鸿蒙Next状态变量Watch使用方法总结
    一、@Watch装饰器概述@Watch装饰器用于监听状态变量的变化,当被装饰的状态变量发生改变时,会触发对应的回调函数执行。其在ArkUI框架内部基于严格相等(===)来判断数值是否更新,仅当严格相等判断为false时,才会触发回调。这为开发者提供了一种有效的方式来响应状态变量的变化,从而实现应......
  • Ciuts的MX模式
    Ciuts的MX模式Citus集群由Coordinator(CN节点)和Worker节点组成。CN节点上放元数据负责SQL分发;Worker节点上放实际的分片,各司其职。但是,citus里它们的功能也可以灵活的转换。1.什么是MX模式?MX模式是Citus的扩展,允许app直接连接work节点进行数据的读取和写入并增加集群的并......
  • 分布式Citus集群与Patroni
    分布式Citus集群与Patroni1.环境介绍2.安装部署2.1安装Docker2.1.1检查是否安装运行以下命令来检查Docker是否已安装:docker--version如果没有返回版本号,则Docker可能未安装。2.1.2安装#更新包索引sudoyumupdate#安装必要的包sudoyuminstall-yyum-......
  • 源码安装patroni+postgresql+citus
    源码安装patroni+postgresql+citus+zookeeper1.安装环境软件版本:python3.9.16postgresql16.4citus12.1patroni4.0.3zookeeper3.7.11.1设置SELinux、防火墙systemctlstatusfirewalldsystemctlstopfirewalldsystemctldisablefirewalldsetenforce0......
  • Citus的restart详解
    Citus的restart详解1.命令行restart在ctl.py的restart方法中,获取到集群的信息,然后再获取到要重启节点的信息。cluster=get_dcs(cluster_name,group).get_cluster()members=get_members(cluster,cluster_name,member_names,role,force,'restart',False,g......
  • 使用sfc /scannow命令,出现“Windows 资源保护找到了损坏文件,但其中有一些文件无法修复
    使用sfc/scannow命令,出现“Windows资源保护找到了损坏文件,但其中有一些文件无法修复。对于联机修复,位于windir\Logs\CBS\CBS.log的CBS日志文件中有详细信息。例如C:\Windows\Logs\CBS\CBS.log。对于脱机修复,/OFFLOGFILE标记提供的日志文件中有详细信息。来自https://ans......
  • 超详细!!关于Docker的使用镜像操作
    需要搭建帮助的可以去taobao搜索许风继续吹技术服务,谢谢!!!需要搭建帮助的可以去taobao搜索许风继续吹技术服务,谢谢!!!一、获取镜像之前提到过,DockerHub上有大量的高质量的镜像可以用,这里我们就说一下怎么获取这些镜像。从Docker镜像仓库获取镜像的命令是dockerpull。其命......
  • how about对比how is;coca区别
    按频率排序youathe,thisiwe"ofsome-ifoneandforjustinlittleme...andoon'swithallgowhat:thosenowmygetwhen WORD 1: HOWABOUT  WORDW1W2  INSTEAD1440  ANOTHER1821  DINNER1771  CALL1111  TOMORROW2212  YOURSELF......