首页 > 编程语言 >C# 异步执行操作

C# 异步执行操作

时间:2023-09-01 17:45:42浏览次数:27  
标签:异步 Task Console C# await 阻塞 线程 执行

为了方便测试异步,先加个计时

计时相关(可以直接跳过该部分)

//开始计时

Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();

// 停止计时
stopwatch.Stop();

//输出计时毫秒数

stopwatch.ElapsedMilliseconds

阻塞延迟,下面两个分别表示阻塞三秒钟

同步阻塞:Thread.Sleep(TimeSpan.FromSeconds(3))

异步阻塞:Task.Delay(3000)

Thread.Sleep(TimeSpan.FromSeconds(3)):

所属命名空间:System.Threading.Thread

使用线程阻塞:调用该方法会导致当前线程被阻塞,即挂起当前线程的执行。

同步操作:Thread.Sleep 是同步的,意味着它会阻塞当前线程并占用系统资源。

精度较低:具体的暂停时间不一定非常准确,可能会稍微长一些。

 

Task.Delay(3000):

 

所属命名空间:System.Threading.Tasks.Task

使用任务异步操作:通过异步编程模型进行操作,异步等待指定的时间。

非阻塞操作:Task.Delay 是异步的,不会阻塞当前线程,而是让线程可以执行其他任务。

高精度定时器:提供更高的精度,具有更准确的延迟时间。

可以与 async/await 一起使用:await Task.Delay 可以与其他异步操作一起使用,提供更灵活和响应式的编程体验。

优缺点比较:

Thread.Sleep 的优点是简单直接,适用于简单的线程阻塞场景。然而,它会阻塞当前线程,并且在等待的过程中,当前线程将无法执行其他任务。

Task.Delay 的优点是允许异步等待一段时间,不会阻塞当前线程,可以与其他异步操作一起使用,提供更高的性能和响应能力。

此外,它还提供了更准确的定时精度。但是,如果不需要进行异步编程,或者代码基于旧版本.NET Framework,可能不适合使用。

介绍异步几个关键字

 

Task(任务):Task 是.NET Framework 和 .NET Core 中的一个类型,表示一个异步操作的单元。它可以被执行、等待和取消,并且可以返回结果。可以通过 Task.Run 方法创建一个 Task。

 

 

async/await 关键字:async/await 是 C# 5.0 引入的语言特性,用于简化异步编程。在方法定义前加上 async 关键字来表示这是一个异步方法,然后可以在方法体内使用 await 关键字来暂停方法的执行,等待一个异步操作完成,然后继续执行后续的代码。被 await 修饰的表达式必须是一个返回 Task 或 Task<T> 的异步方法调用。

 

 

await 关键字:await 关键字用于异步方法内部,表示等待一个异步操作完成。当遇到 await 关键字时,方法会立即返回给调用者,同时异步操作开始执行。等待的过程中,线程可以自由地执行其他任务。当异步操作完成后,该方法会恢复执行,并返回异步操作的结果。

 

 

Task.WhenAll 方法:Task.WhenAll 方法用于等待多个异步任务完成。它接受一个 Task 数组或可迭代对象作为参数,并返回一个新的 Task,该 Task 在所有传递的任务都完成后变为完成状态。你可以使用 await Task.WhenAll 来等待多个任务同时完成。

 

常见的属性

 

Task.Status 属性:表示任务的状态,有以下几种可能的值:

 

  1. Created:任务已创建但未开始执行。
  2. WaitingForActivation:任务在等待激活,即还未被调度器执行。
  3. WaitingToRun:任务已被调度器接受,并等待在可用线程上运行。
  4. Running:任务正在执行。
  5. WaitingForChildrenToComplete:父任务正在等待其所有子任务完成。
  6. RanToCompletion:任务成功完成。
  7. Faulted:任务发生了异常。
  8. Canceled:任务被取消。

Task.Result 属性:获取异步操作的返回结果。该属性只能在异步操作完成后使用,并且会阻塞当前线程直到异步操作完成。

下面上代码示例

async Task Main()
{
    //计时
    Stopwatch stopwatch = new Stopwatch();
    // 开始计时
    stopwatch.Start();
    //执行顺序和添加顺序有关
    await Task.WhenAll(A());//先执行A
    await Task.WhenAll(B());//等待A执行完再执行B
    List<Task> tasks = new List<Task>()
    { C(),D() };//等待B执行完后CD一起执行
    //也可以逐个添加
    //tasks.Add(A());
    //tasks.Add(B());
    //tasks.Add(C());
    //tasks.Add(D());

    // 等待CD方法全部完成
    await Task.WhenAll(tasks);
    // 停止计时
    stopwatch.Stop();
    Console.WriteLine($"计时结束!总共用时:{stopwatch.ElapsedMilliseconds} 毫秒");
}

async Task A()
{
    Console.WriteLine("阻塞3秒");
    await Task.Delay(3000);
    Console.WriteLine("3秒结束");
}
async Task B()
{
    Console.WriteLine("阻塞2秒");
    await Task.Delay(2000);
    Console.WriteLine("2秒结束");
}
async Task C()
{
    Console.WriteLine("阻塞5秒");
    await Task.Delay(5000);
    Console.WriteLine("5秒结束");
}
async Task D()
{
    Console.WriteLine("阻塞10秒");
    await Task.Delay(10000);
    Console.WriteLine("10秒结束");
}

  

 

标签:异步,Task,Console,C#,await,阻塞,线程,执行
From: https://www.cnblogs.com/HoFei/p/17672548.html

相关文章

  • C#访问SQLite完整增删改查代码
    文章转载自:https://wobushixiaohai.blog.csdn.net/article/details/117804179?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-3-117804179-blog-103633083.235%5Ev38%5Epc_relevant_anti_vip_base&depth_1-u......
  • 用tcpdump抓包做网络分析
    tcpdump不指定任何参数,监听第一块网卡上经过的数据包tcpdump-ieth0监听特定网卡tcpdumphost192.168.0.1监听特定主机的通信包tcpdumpsrchosthostname  特定来源tcpdumpdsthosthostname  特定目标tcpdumpport80           特定端口监听TC......
  • 视频监控平台EasyCVR如何处理无法探测到对应设备的情况
    EasyCVR安防协议视频综合管理系统在研发初期就以"全能型"平台为目标进行设计,支持各种私有协议接入,并且提供了Onvif探测功能。采用Onvif协议的优势在于,终端用户和集成商可以选择不同制造商的技术和解决方案。该协议的支持大大拓展了EasyCVR的适用范围,使其具备更广泛的应用性。在局域......
  • 安防视频监控平台EasyCVR如何将默认快照的raw格式改为jpg/base64格式?
    视频监控/视频汇聚/安防视频监控平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。视频云存储EasyCVR平台能在复杂的网络环境中,将分散的各类视频资源进行统......
  • MapReduce 中的两表 join 几种方案简介
    1.概述在传统数据库(如:MYSQL)中,JOIN操作是非常常见且非常耗时的。而在HADOOP中进行JOIN操作,同样常见且耗时,由于Hadoop的独特设计思想,当进行JOIN操作时,有一些特殊的技巧。本文首先介绍了Hadoop上通常的JOIN实现方法,然后给出了几种针对不同输入数据集的优化方法。2.常见的join方法介......
  • 云存储/磁盘阵列/视频监控管理平台EasyCVR接入海康SDK后视频播放崩溃问题排查
    视频集中存储/云存储/磁盘阵列/视频监控管理平台EasyCVR可支持海量视频的轻量化接入与汇聚管理。在视频能力上,EasyCVR可实现视频直播、云端录像、检索与回放、云存储、告警上报、语音对讲、电子地图、H.265视频自动转码、服务器集群、AI智能分析接入以及平台级联等。安防监控EasyCV......
  • Spring Security3
    使用SpringSecurity3的四种方法概述    那么在SpringSecurity3的使用中,有4种方法:    一种是全部利用配置文件,将用户、权限、资源(url)硬编码在xml文件中,已经实现过,并经过验证;    二种是用户和权限用数据库存储,而资源(url)和权限的对应采用硬编码配置,目前这种方式已经......
  • 如何使用UC网盘分享传输的内容
    UC网盘是一款由阿里巴巴旗下的UC浏览器推出的云存储服务,它可以让用户在不同的设备上方便地存储和管理文件,大文件分享助手,同时也支持文件的分享和传输功能。使用UC网盘分享内容的方法很简单,只需要几个步骤就可以完成。下面就来详细介绍一下使用UC网盘分享内容的步骤。打开UC浏览器,进......
  • 5分钟带你回顾大文件分片以及异步计算hash的步骤
    背景  文件上传功能在中后台项目中是最常见的功能,分片上传是一种将大文件分割成多个小片段进行上传的技术,可以有效提高文件上传的速度和稳定性。思路  1.首先就是使用File.slice对文件进行分割产出一个数组用于存储每个小的chunk片段  2.异步计算hash值,可用作标识文......
  • 前端使用xlsx插件读取excel文件数据
    安装xlsx插件npminstallxlsx导入xlsximportXLSXfrom'xlsx'前端UI如下:<bk-upload:tip="'只允许上传JPG、PNG、JPEG的文件'":with-credentials="true":accept="'.xlsx,.xls'"@c......