官方的解释看得头晕,看了几篇博客写了这篇学习笔记
什么是异步编程
逍遥现在有两件事,事情一(花费 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;
}
);
}
}
}
结果如下