怎么在调用异步请求时不阻塞当前线程
Posted 一品码农
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么在调用异步请求时不阻塞当前线程相关的知识,希望对你有一定的参考价值。
在异步编程中,经常会调用已经写好的异步方法。这时会有一个需求:根据异步方法的返回值,做一些别的操作。这时会有两种实现方式:
1. 使用await,阻塞线程,等待异步方法的完成,然后获得返回值,再进行别的操作。示例:
static void Main(string[] args) { Console.WriteLine("--------------程序运行开始-----------"); string url = "http://www.baidu.com"; var httpReq = (HttpWebRequest)HttpWebRequest.Create(new Uri(url)); Console.WriteLine("web请求完成,在这里可以处理完成后的业务!"); Console.WriteLine("--------------程序运行结束-----------"); Console.Read(); }
1.1 运行结果:
1.2 很明显这种调用形式,会阻塞线程。所以这样调用也就失去了异步方法的优点。
2. 重新开启一个异步方法,在这个新的异步方法内部,调用需要请求的异步方法。示例:
1 static void Main(string[] args) 2 { 3 Console.WriteLine("--------------程序运行开始-----------"); 4 5 PostAsync(); 6 7 Console.WriteLine("--------------程序运行结束-----------"); 8 9 Console.Read(); 10 } 11 12 //异步http请求 13 public async static void PostAsync() 14 { 15 HttpWebResponse httpRes = (HttpWebResponse)await PostData(); 16 17 if (httpRes.StatusCode == HttpStatusCode.OK) 18 { 19 var text = new StreamReader(httpRes.GetResponseStream()).ReadToEnd(); 20 21 Console.WriteLine("web请求完成,在这里可以处理完成后的业务!"); 22 } 23 } 24 25 public async static Task<WebResponse> PostData() 26 { 27 string url = "http://www.baidu.com"; 28 29 var httpReq = (HttpWebRequest)HttpWebRequest.Create(new Uri(url)); 30 31 return await httpReq.GetResponseAsync(); 32 }
2.1 运行结果:
2.2 很明显,这种调用方式才发挥了异步方法的作用。即不会阻塞当前线程的执行。
以上是关于怎么在调用异步请求时不阻塞当前线程的主要内容,如果未能解决你的问题,请参考以下文章