对于异步编程Await和Async的理解
2024-10-07 18:45:59
public class AsyncInSync
{
/// <summary>
/// 同步代码里有异步代码
///
///
/// 结果
/// Main Thread Before DelayAsync:1
/// DelayAsync Before Await Thread ID:1
/// DelayReturnTaskAsync Before Await Thread ID:1
/// Main Thread After DelayAsync:1
/// DelayReturnTaskAsync After Await Thread ID:4
/// DelayAsync After Await Thread ID:4
/// </summary>
static public void Test()
{
Console.WriteLine("Main Thread Before DelayAsync:" + Thread.CurrentThread.ManagedThreadId);
DelayAsync(10000);
Console.WriteLine("Main Thread After DelayAsync:" + Thread.CurrentThread.ManagedThreadId);
}
/// <summary>
/// 异步代码里有异步代码
///
///
/// 异步方法里有同步代码执行顺序:
/// 1 当前线程:进入DelayAsync方法
/// 2 当前线程:同步执行Thread.Sleep(1000);
/// 3 当前线程:(发现async里有await)当前线程返回DelayAsync的调用方向下执行。
/// 4 其他线程:执行await后的函数和Thread.Sleep(2000);)
///
/// 在异步方法中:Await之前的执行还是调用的线程,Await之后的执行就是另一个线程了
/// 即:异步方法中,Await之前还是当前线程的同步方法
///
/// </summary>
/// <param name="ms"></param>
/// <returns></returns>
static async void DelayAsync(int ms)
{
Thread.Sleep(1000);
Console.WriteLine("DelayAsync Before Await Thread ID:" + Thread.CurrentThread.ManagedThreadId);
await DelayReturnTaskAsync(ms);
Console.WriteLine("DelayAsync After Await Thread ID:" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(2000);
}
/// <summary>
/// 异步代码里有异步代码
/// </summary>
/// <param name="ms"></param>
/// <returns></returns>
static async Task DelayReturnTaskAsync(int ms)
{
Thread.Sleep(1000);
Console.WriteLine("DelayReturnTaskAsync Before Await Thread ID:" + Thread.CurrentThread.ManagedThreadId);
await Task.Delay(ms);
Console.WriteLine("DelayReturnTaskAsync After Await Thread ID:" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(2000);
}
}
最新文章
- Lua 学习笔记(十)数据结构
- bzoj2141 树状数组套Treap树
- Python排序算法
- Lambda表达式和表达式树
- <;System.ServiceModel>;
- 基于 HTML5 的数据存储
- java初级开发一系列的工具安装配置
- abapGit分支策略
- MySQL聚集索引和非聚集索引
- SLAM+语音机器人DIY系列:(二)ROS入门——4.如何编写ROS的第一个程序hello_world
- C#工具:CSV文件转换帮助类
- Tomcat 部署项目的三种方法(转)
- 使用canvas实现一个圆球的触壁反弹
- 后端调用接口在通过webService发布 解决跨域问题
- Android 数据存储03之SQLite
- 如何在Windows环境下安装JDK
- mybatis 之parameterType=";Long";
- 高可用api接口网络部署方案
- 使用Django来处理对于静态文件的请求
- diff命令的参数详解和实例