using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace test
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(DateTime.Now + "(线程号:" + Thread.CurrentThread.ManagedThreadId.ToString() + "):进入Main");
string name = Getinfo().Result; //用到了Getinfo()的结果,所以这里会等待它执行完毕后 才执行后续代码
Console.WriteLine(DateTime.Now + "(线程号:" + Thread.CurrentThread.ManagedThreadId.ToString() + "):回到Main了");
Console.ReadLine();
}
private async static Task<string> Getinfo()
{
Console.WriteLine(DateTime.Now + "(线程号:" + Thread.CurrentThread.ManagedThreadId.ToString() + "):进入Getinfo");
await GetName();
Console.WriteLine(DateTime.Now + "(线程号:" + Thread.CurrentThread.ManagedThreadId.ToString() + "):我在GetName后面");//用await的线程执行
GetGender();//直接调用,没有用到Getinfo的结果,也没有await关键字,所以不会等待它的结果返回,直接执行后续代码
Console.WriteLine(DateTime.Now + "(线程号:" + Thread.CurrentThread.ManagedThreadId.ToString() + "):我在GetGender后面");
return "hello";
}
private static async Task<string> GetName()
{
return await Task.Run(() =>
{
Console.WriteLine(DateTime.Now + "(线程号:" + Thread.CurrentThread.ManagedThreadId.ToString() + "):进入GetName");
Thread.Sleep(3000);
Console.WriteLine(DateTime.Now + "(线程号:" + Thread.CurrentThread.ManagedThreadId.ToString() + "):GetName休眠3秒后");
return "lisi";
});
}
private static async void GetGender()
{
await Task.Run(() =>
{
Console.WriteLine(DateTime.Now + "(线程号:" + Thread.CurrentThread.ManagedThreadId.ToString()+ "):进入GetGender");
Thread.Sleep(3000);
Console.WriteLine(DateTime.Now + "(线程号:" + Thread.CurrentThread.ManagedThreadId.ToString() + "):GetGender休眠3秒后");
});
}
}
}
运行结果:
结论:
-
await 关键字表明了会等待任务执行完成 才继续执行后续代码
没有await 关键字时,就不会等待,直接执行后续代码: -
将耗时的任务用异步来完成,开辟新线程来执行,不阻塞当前线程
-
await后的代码会用await任务开辟的线程继续执行。
-
如果用到了异步方法的结果,就算没有await关键字也会等待它的结果返回才会执行后续代码。如果没有用到到异步方法的结果,也没有加await关键字,则不会等待任务完成就继续执行后续代码。
/************************************************* 分割线 ***********************************************************/
修改一下代码:
结论:
调用异步方法时,遇到异步方法里的await关键字才会返回;遇到await之前,主线程依然被阻塞。
延伸:
小程序的api,也是异步的。虽然方法里有很多await,但只是阻塞了方法内部的代码执行,并没有阻塞主线程,所以小程序调用api后,会很快就返回小程序端,小程序端就能继续执行后续代码,等到api执行完成再将结果返回给小程序,小程序感应到结果返回再做相应处理。
如果api是同步的,或者await关键字在处理了时间较长的逻辑后才出现,小程序UI反应就会变慢。