这段时间在项目开发中看到了一些async/await的使用,在aspnet core的host组件源码中也看到了许多的async/await代码。在开发时,正确的使用了async/await是可以提高程序的性能。下面的代码教你正确的理解await关键字的暂停/阻塞方法调用:
static void Main(string[] args) { Console.WriteLine("-------主线程启动-------"); var task = GetStrLengthAsync(); Console.WriteLine("主线程继续执行"); Console.WriteLine("Task返回的值: " + task.Result); Console.WriteLine("-------主线程结束-------"); Console.Read(); } static async Task<string> GetStrLengthAsync() { Console.WriteLine("GetStrLengthAsync方法开始执行"); var str = await GetString(); Console.WriteLine("GetString方法调用结束"); var str1 =await GetStringOne(); Console.WriteLine("GetStringOne方法调用结束"); Console.WriteLine("GetStrLengthAsync方法执行结束"); return str + " ###### " + str1; }
///await关键字会暂停/阻塞其所在的方法,返回调用 await关键字所在的方法处 继续执行,而不是接着await关键字所在的代码处往下执行,注释下面的代码,查看运行结果即可确认。
//static async Task<string> GetStrLengthAsync()
//{
// Console.WriteLine("GetStrLengthAsync方法开始执行");
// var str = GetString();
// Console.WriteLine("GetString方法调用结束");
// var str1 = GetStringOne();
// Console.WriteLine("GetStringOne方法调用结束");
// Console.WriteLine("GetStrLengthAsync方法执行结束");
// return await str + " ###### " + await str1;
//}
static async Task<string> GetString() { Console.WriteLine("GetString方法开始执行"); return await Task.Run(() => { Thread.Sleep(2000); return "GetString的返回值"; }); } static async Task<string> GetStringOne() { Console.WriteLine("GetStringOne方法开始执行"); return await Task.Run(() => { Thread.Sleep(2000); return "GetStringOne的返回值"; }); }
await关键字会阻塞/暂停它所在的方法。根据结果即可判断:
//主线程启动
//GetStrLengthAsync方法开始执行
//GetString方法开始执行
//主线程继续执行
//GetString方法调用结束
//GetStringOne方法开始执行
//GetStringOne方法调用结束
//GetStrLengthAsync方法执行结束
//Task返回的值:
//主线程结束
//主线程启动
//GetStrLengthAsync方法开始执行
//GetString方法开始执行
//GetString方法调用结束
//GetStringOne方法开始执行
//GetStringOne方法调用结束
//GetStrLengthAsync方法执行结束
//主线程继续执行
//Task返回的值:
//主线程结束