翼度科技»论坛 编程开发 .net 查看内容

C# 异步执行操作

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
为了方便测试异步,先加个计时
计时相关(可以直接跳过该部分)
//开始计时
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 的异步方法调用。
 
 
await 关键字:await 关键字用于异步方法内部,表示等待一个异步操作完成。当遇到 await 关键字时,方法会立即返回给调用者,同时异步操作开始执行。等待的过程中,线程可以自由地执行其他任务。当异步操作完成后,该方法会恢复执行,并返回异步操作的结果。
 
 
Task.WhenAll 方法:Task.WhenAll 方法用于等待多个异步任务完成。它接受一个 Task 数组或可迭代对象作为参数,并返回一个新的 Task,该 Task 在所有传递的任务都完成后变为完成状态。你可以使用 await Task.WhenAll 来等待多个任务同时完成。
 
常见的属性
 
Task.Status 属性:表示任务的状态,有以下几种可能的值:
 

  • Created:任务已创建但未开始执行。
  • WaitingForActivation:任务在等待激活,即还未被调度器执行。
  • WaitingToRun:任务已被调度器接受,并等待在可用线程上运行。
  • Running:任务正在执行。
  • WaitingForChildrenToComplete:父任务正在等待其所有子任务完成。
  • RanToCompletion:任务成功完成。
  • Faulted:任务发生了异常。
  • Canceled:任务被取消。
Task.Result 属性:获取异步操作的返回结果。该属性只能在异步操作完成后使用,并且会阻塞当前线程直到异步操作完成。
下面上代码示例
  1. async Task Main()
  2. {
  3.     //计时
  4.     Stopwatch stopwatch = new Stopwatch();
  5.     // 开始计时
  6.     stopwatch.Start();
  7.     //执行顺序和添加顺序有关
  8.     await Task.WhenAll(A());//先执行A
  9.     await Task.WhenAll(B());//等待A执行完再执行B
  10.     List<Task> tasks = new List<Task>()
  11.     { C(),D() };//等待B执行完后CD一起执行
  12.     //也可以逐个添加
  13.     //tasks.Add(A());
  14.     //tasks.Add(B());
  15.     //tasks.Add(C());
  16.     //tasks.Add(D());
  17.     // 等待CD方法全部完成
  18.     await Task.WhenAll(tasks);
  19.     // 停止计时
  20.     stopwatch.Stop();
  21.     Console.WriteLine($"计时结束!总共用时:{stopwatch.ElapsedMilliseconds} 毫秒");
  22. }
  23. async Task A()
  24. {
  25.     Console.WriteLine("阻塞3秒");
  26.     await Task.Delay(3000);
  27.     Console.WriteLine("3秒结束");
  28. }
  29. async Task B()
  30. {
  31.     Console.WriteLine("阻塞2秒");
  32.     await Task.Delay(2000);
  33.     Console.WriteLine("2秒结束");
  34. }
  35. async Task C()
  36. {
  37.     Console.WriteLine("阻塞5秒");
  38.     await Task.Delay(5000);
  39.     Console.WriteLine("5秒结束");
  40. }
  41. async Task D()
  42. {
  43.     Console.WriteLine("阻塞10秒");
  44.     await Task.Delay(10000);
  45.     Console.WriteLine("10秒结束");
  46. }
复制代码
  
 

来源:https://www.cnblogs.com/HoFei/archive/2023/09/01/17672548.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具