官方的解释看得头晕,看了几篇博客写了这篇学习笔记
什么是异步编程
逍遥现在有两件事,事情一(花费 50 分钟)、事情二(花费 10 分钟)
如果让逍遥一个人做,那么需要花费的时间就是 60 分钟
但是如果逍遥在做事情一的时候让另一个人帮逍遥做事情二,那么花费的时间就是50分钟
结合下面 代码,应该能理解些许
示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace TestDemo
{
class Program
{
static void Main(string[] args)
{
// 获取当前时间戳
string begin = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds().ToString();
// 记录当前线程 ID
Console.WriteLine("Main " + "当前线程 ID :"+ Thread.CurrentThread.ManagedThreadId);
// 调用 await
DoSomething();
// 以执行该方法的线程 Sleep() 5000ms 来模拟当前线程要做的事
Thread.Sleep(5000);
// 记录当前线程 ID
Console.WriteLine("Main " + "当前线程 ID :" + Thread.CurrentThread.ManagedThreadId);
// 获取结束时间戳
string end = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds().ToString();
// 花费时间
int time = (int)(ulong.Parse(end) - ulong.Parse(begin));
Console.WriteLine("使用 await 花费时间: " + time);
Console.WriteLine("\n" + "============分割线=================" + "\n");
// 获取当前时间戳
begin = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds().ToString();
// 记录当前线程 ID
Console.WriteLine("Main " + "当前线程 ID :" + Thread.CurrentThread.ManagedThreadId);
// 不调用 await
DoSomethingNoAwait();
// 以执行该方法的线程 Sleep() 5000ms 来模拟当前线程要做的事
Thread.Sleep(5000);
// 记录当前线程 ID
Console.WriteLine("Main " + "当前线程 ID :" + Thread.CurrentThread.ManagedThreadId);
// 获取结束时间戳
end = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds().ToString();
// 花费时间
time = (int)(ulong.Parse(end) - ulong.Parse(begin));
Console.WriteLine("不使用 await 花费时间: " + time);
Console.WriteLine("\n" + "============分割线=================" + "\n");
// 当 Task 需要返回值时
Task<int[]> taskRes = init(1,10);
// 真的结果需要使用 Task<T> 的引用 task 的属性 Result 来接收
int[] res = taskRes.Result;
// 打印
Console.Write("res[] :");
for (int i = 0; i < res.Length; i++)
{
Console.Write(res[i] + " ");
}
}
static async void DoSomething()
{
Console.WriteLine("调用 DoSomething() ...currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
await Task.Run(() => {
Console.WriteLine("await Task.Run(()) 开始 ...currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(3000);
Console.WriteLine("await Task.Run(()) 结束 ...currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
});
Console.WriteLine("结束 DoSomething() ...currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
}
static void DoSomethingNoAwait()
{
Console.WriteLine("调用 DoSomethingNoAwait() ...currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(3000);
Console.WriteLine("结束 DoSomethingNoAwait() ...currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
}
static async Task<int[]> init(int start,int end)
{
return await Task<int[]>.Run(() =>
{
int[] res = new int[end];
for (int i = start; i < end; i++)
{
res[i] = i;
}
return res;
}
);
}
}
}
结果如下
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!